2013-05-18 8 views
8

投稿の最大サイズの値を心配することなく、大きなファイルをアップロードできるようにします。 代わりに、PUTを使用してファイルを生データとして送信しています。 jqueryのを使用している場合 私はこれを行うことができます。フォームの境界とphp://の入力をPHPのファイルに入力する

はPHPで
var data = new FormData(); 
    jQuery.each($('#file_upload')[0].files, function(i, file) { 
    data.append('file-'+i, file); 
}); 
$.ajax({ 
    url: 'upload.php?filename=test.pdf', 
    data: data, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'PUT', 
}); 

私はこれを行うことができます:私はやっておりません

$f = fopen($_GET['filename'], "w"); 
$s = fopen("php://input", "r"); 

while($kb = fread($s, 1024)) 
{ 
    fwrite($f, $kb, 1024); 
} 
fclose($f); 
fclose($s); 
Header("HTTP/1.1 201 Created"); 

$client_data = file_get_contents("php://input"); 

を変数にファイル全体を置くので、巨大なファイルをアップロードするときに必ずすべてのメモリを埋めるでしょう。

私が理解できないことは、フォーム境界なしでファイルデータを書き込む方法です。

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG 
Content-Disposition: form-data; name="file-0"; filename="somename.pdf" 
Content-Type: application/pdf 

と、このような下に何かで:

------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--  

だから私は、データを解析する必要が 今のところは、このようなファイルの何かの先頭に書き込まれます。しかし、そのために私は全体のデータストリームをメモリに読み込む必要があり、大きなビデオファイルではそれをやりたくありません。 私はおそらくphp:// tempストリームを作成することについて何かを読んだ。しかし、それはまだ運がありません。 境界ヘッダーなしでコンテンツをファイルに書き込むにはどうすればよいですか?そして、最初にすべてのデータを変数にポンピングする必要はありませんか?たぶん

+0

あなたは 'Content-Type'ヘッダを提供できますか? –

答えて

1

改行で読み、境界のチェックを停止するfgetsの組み合わせ:

while($kb = fgets($s, 1024)) 
{ 
    if(strpos($kb, '------') === false) //or !== 0 for first position 
    { 
     fwrite($f, $kb, 1024); 
    } 
} 
+0

しかし、 '-----'が同じチャンクに含まれていることを確認する方法はありますか?最初のチャンクの末尾に「---」が含まれていて、「---」が2番目のチャンクの先頭に含まれる場合はどうなりますか?それとも、それは事実ではありませんか? – Tamara

+0

'fgets'は' \ n'行の最後まで読み込まれ、 - は次の行の先頭にあります。 – AbraCadaver

+0

その場合、次のヘッダーはどうなりますか?それらもファイルを損傷します。 –

1

あなたは(多くのそれのようにあります)thisを使用することができます。チャンクアップロードをサポートしています。つまり、各アップロードチャンクがポストマックスサイズより小さい限り、ポスト/ファイルの最大サイズをヒットしません。

また、サーバ側で必要となるPHP codeも含まれています。

+0

私はアップロードされたファイルがたくさんあるいくつかのサイトでそのblueimpアップローダーを使用していて、ユーザーにとってはうまくいきました。 –

0

ホイールを再作成する必要はありません。 POSTを使用して、PHPの設定をより大きな制限に変更してください。これらの制限は、ディレクトリ/ホスト単位で設定することもできます。 .htaccessのか、あなたのapache.conf

php_value upload_max_filesize 10G 
php_value post_max_size 10G 

を使用して

max_input_timeのような他の制限を調整することも良いアイデアです。

余分な作業を避けるために、受信したファイルをmove_uploaded_fileを使用して再配置することを忘れないでください。

関連する問題