PHPアプリケーション(数百メガ-8ギガ)への非常に大きなファイルのアップロードを許可したいのですが、これにはいくつか問題があります。
ブラウザ:
サーバ:
要件:
Javaアプレットはどうですか?これが私が以前働いていた会社でそれをしなければならなかった方法です。私はすべてのオプションが利用できる今日、特にこの時代に吸うことを知っていますが、本当にWeb開発で発生するデスクトップのような問題に対する最も用途の広いソリューションです。
upload_max_filesizeを設定できます ディレクトリごとに ;同じことがpost_max_sizeにも当てはまります
例えば。:
<Directory /uploadpath/>
php_value upload_max_filesize 10G
php_value post_max_size 10G
</IfModule>
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
古いのは知っていますが、最近この問題が発生しているのかもしれません。これで、JavaScriptと、たとえばPHPだけでこれを行うことができます。 Flashなし、またはJavaクライアント側では必要ありません。
デモ: http://dnduploader.filkor.org/
アイデアは、JavaScriptのBlob slice()メソッドでファイルをスライスすることです...
これをすべて試しました...これは私が今まで使った中で最高です...
1つのディレクトリ内のスクリプトのみにpost_max_sizeを設定できます。アップロードスクリプトをそこに配置し、そのスクリプトのみが大きなサイズを処理できるようにします。そのスクリプトが大きな/役に立たないファイルで攻撃される可能性はまだありますが、グローバルに設定することは避けます。
これをAPCで使用すると、何かうまくいくかもしれません: IBM DeveloperはAPCについての記事
jumploader.com を見てください
アップロードに適したJavaアプレット。
私はそれを画像のアップロードに使用しましたが、正常に動作します。 10MBより大きいファイルで試したことはありませんが、本当に大きなファイルでも動作するはずです。
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などの別のプロトコルを使用して)、期待どおりの結果が得られない場合があります。 。
私は与えられた制約の範囲内でできる限りのことをしました。申し訳ありませんが、私はうまくできませんでした。
APCを使用して進行状況と合計ファイルサイズを確認しましたか。これが 良いブログ投稿 です。役立つかもしれません。
多分あなたはブラウザで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を引き渡す前にプレリュードで処理できる秘密鍵と何ができないか
私は調べます FTP、SSHまたはSCP これにより、大きなファイルをアップロードし、ファイルへのアクセス制御を維持することができます。これは実装に少し時間がかかるかもしれませんが、おそらく私が考えることができる最も安全な方法です。
別の依存関係を追加するのは面倒ですが、私の経験では、このようなことをしているほとんどのWebサイトはクライアント側でフラッシュを使用しており、大きなファイルをチャンクとしてアップロードしています
Adobeの Flashファイルのアップロードに関するハウツー
Codeprojectにもこのチュートリアルがあります。
FlashとASP.NETを使用したプログレスバーでの複数ファイルのアップロード
PS-私はあなたがPHPを使用していることを知っています、私は重要な部分がフラッシュだったと思いました;)