web-dev-qa-db-ja.com

PHP

PHPアプリケーション(数百メガ-8ギガ)への非常に大きなファイルのアップロードを許可したいのですが、これにはいくつか問題があります。

ブラウザ:

  • HTMLアップロードには不正確なフィードバックがあり、進行状況をポーリングする(少しばかげています)か、フィードバックをまったく表示しない必要があります
  • Flashアップローダーは、アップロードを開始する前にファイル全体をメモリに配置します

サーバ:

  • PHPはpost_max_sizeを設定するように強制します。これにより、DOS攻撃が容易に悪用される可能性があります。この設定をグローバルに設定しないでください。
  • サーバーは、POST変数にある秘密鍵などの他の変数も必要です。ファイル全体の後ではなく、すぐに要求を拒否できるようにしたいと考えています。アップロードされました。

要件:

  • HTTPは必須です。
  • ブラウザで動作する限り、クライアント側のテクノロジーに柔軟に対応できます。
  • PHPは必須ではありません。Linux環境で適切に機能する他のテクノロジーがある場合、それは完全に優れています。
37
Evert

Javaアプレットはどうですか?これが私が以前働いていた会社でそれをしなければならなかった方法です。私はすべてのオプションが利用できる今日、特にこの時代に吸うことを知っていますが、本当にWeb開発で発生するデスクトップのような問題に対する最も用途の広いソリューションです。

3
Marc W

upload_max_filesizeを設定できます ディレクトリごとに ;同じことがpost_max_sizeにも当てはまります

例えば。:

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>
14
Frank Farmer

Pythonハンドラ?

PHPの代わりにPython POSTハンドラを使用します。クライアントが入力できるPHPアプリから一意の識別子を生成しますHTTPヘッダー。mod_pythonを使用して、POST本文全体が送信される前に大量のアップロードを拒否または受け入れます。

私は思う http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

ヘッダーをチェックして、残りのPOST入力を拒否できます。まだ試していませんが、正しいパスかもしれません。

Mod_pythonのソースを見ると、read()を介した入力のバッファリングにより、HTTP入力を一度に少しずつ評価できるようです。ヘッダーが最初です。

https://svn.Apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

7
Aiden Bell

古いのは知っていますが、最近この問題が発生しているのかもしれません。これで、JavaScriptと、たとえばPHPだけでこれを行うことができます。 Flashなし、またはJavaクライアント側では必要ありません。

デモ: http://dnduploader.filkor.org/

アイデアは、JavaScriptのBlob slice()メソッドでファイルをスライスすることです...

7
Filkor

これをすべて試しました...これは私が今まで使った中で最高です...

http://www.uploadify.com/

2
MichaelICE

1つのディレクトリ内のスクリプトのみにpost_max_sizeを設定できます。アップロードスクリプトをそこに配置し、そのスクリプトのみが大きなサイズを処理できるようにします。そのスクリプトが大きな/役に立たないファイルで攻撃される可能性はまだありますが、グローバルに設定することは避けます。

これをAPCで使用すると、何かうまくいくかもしれません: IBM DeveloperはAPCについての記事

2
acrosman

jumploader.com を見てください

アップロードに適したJavaアプレット。

私はそれを画像のアップロードに使用しましたが、正常に動作します。 10MBより大きいファイルで試したことはありませんが、本当に大きなファイルでも動作するはずです。

2
Johan

ploadify で成功したので、お勧めします。これは大量のアップロードを処理するjQuery/Flashスクリプトであり、追加のパラメーター(秘密鍵など)を渡すことができます。サーバー側の問題を解決するには、次のコードを使用します。変更は、呼び出されたスクリプトにのみ影響します。

//Check to see if the key is there
if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key']))
{
    exit("Invalid request");
}
function isValid($key)
{
    //Put your validation code here.
}

//This line changes the timeout.
//Give it a value in seconds (3600 = 1 hour)
set_time_limit(3600);

//Set these amounts to whatever you need.
ini_set("post_max_size","8192M");
ini_set("upload_max_filesize","8192M");

//Generally speaking, the memory_limit should be higher
//than your post size.  So make sure that's right too.
ini_set("memory_limit","8200M");

[〜#〜] edit [〜#〜]コメントへの応答:

あなたが言ったことを考えると、あなたはhttpであなたの要件を満たすことができないかもしれません。そこにあるすべてのソリューションは、httpに設計されたことのない機能を追加するコードです。

あなたが言ったように、それは単純なプロトコルです。ブラウザーの外部で実行する独自のクライアントソフトウェアを作成する以外に、Javaアプレット、またはこのために設計されたFTPなどの別のプロトコルを使用して)、期待どおりの結果が得られない場合があります。 。

私は与えられた制約の範囲内でできる限りのことをしました。申し訳ありませんが、私はうまくできませんでした。

1
Andrew Ensley

APCを使用して進行状況と合計ファイルサイズを確認しましたか。これが 良いブログ投稿 です。役立つかもしれません。

1
Peter D

多分あなたはブラウザでWebdavとJavascriptを使うことができたでしょう

AJAX Big file upload、with progress、to、WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

シンプルなライブラリ

http://debris.demon.nl/projects/davclient.js/doc/README.html

次に、JSを取得して、ユーザーを成功ページにリダイレクトできます。 PHP JS Client-> WebDAVを引き渡す前にプレリュードで処理できる秘密鍵と何ができないか

1
Aiden Bell

私は調べます FTP、SSHまたはSCP これにより、大きなファイルをアップロードし、ファイルへのアクセス制御を維持することができます。これは実装に少し時間がかかるかもしれませんが、おそらく私が考えることができる最も安全な方法です。

1
Phill Pafford

別の依存関係を追加するのは面倒ですが、私の経験では、このようなことをしているほとんどのWebサイトはクライアント側でフラッシュを使用しており、大きなファイルをチャンクとしてアップロードしています

Adobeの Flashファイルのアップロードに関するハウツー

Codeprojectにもこのチュートリアルがあります。

FlashとASP.NETを使用したプログレスバーでの複数ファイルのアップロード

PS-私はあなたがPHPを使用していることを知っています、私は重要な部分がフラッシュだったと思いました;)

0
Jiaaro