1

jQuery ファイルのアップロード

アップロード スクリプト:

$('#fileupload').fileupload({
    url: 'api/combox_upload.php',
    type: 'POST',
    dataType: 'json',
    dropZone: $dropZone,
    singleFileUploads: true,
    done: function (e, data) {
        attachments = attachments.concat(data.result);
        refreshAttachments();
    },
    add: function(e, data) {
        var file = data.files[0];
        data.context =
            $('<li>',{'class':'file-upload-item'})
                .append($('<span>').text(file.name))
                .append(
                    $('<div>',{'class':'progressbar'})
                    .append($('<div>',{'class':'progress'}))
                ).appendTo($fileUploads);
        data.submit(); // start upload immediately
    },
    progress: function(e, data) {
        var progress = data.loaded / data.total;
        data.context.find('.progress').stop().animate({'width':(progress*100)+'%'},100,'linear');
        //data.context.find('.progress').css({'width':(progress*100)+'%'});
    }
});

私のapi/combox_upload.phpスクリプトでは、私echo json_encode($_FILES)と半分の時間は空白に戻ります (Chrome 開発者ツールバーで XHR 要求の応答を見ています)。

何故ですか?常にファイルを送信するように修正するにはどうすればよいですか?

編集:大きなファイルではより頻繁に発生するようです。

マルチパート データを正しく処理しない PHP の問題でしょうか? ファイルのアップロードが開始されるとすぐに、XHR リクエストがすぐに送信されることに気付きましたが、PHP は明らかにファイル全体をまだ取得していません。オブジェクトにアクセスしようとするとブロックされます$_FILESか、それとも空の配列が返されるだけですか? 何か特別なことをしなければなりませんか?

4

1 に答える 1

2

試行錯誤の結果、この問題は約 23 MiB を超えるファイルでのみ発生することがわかりました。それが普遍的な定数なのか、サーバーの構成方法に固有のものなのかはわかりません。

それでも、この制限を回避する方法を見つけました。たとえば、falseに設定singleFileUploadsする必要があります。truemultipart

$('#fileupload').fileupload({
    url: 'api/upload.php',
    type: 'POST',
    dataType: 'json',
    singleFileUploads: true,
    multipart: false,
    ...

そして、phpスクリプトで次のようにデータを読み取ることができます。

$handle = fopen('php://input', 'r');

$file_data = '';

while(($buffer = fgets($handle, 4096)) !== false) {
    $file_data .= $buffer;
}

fclose($handle);

配列はまだ空なので、$_FILESそこからファイル名を取得することはできませんが、Content-Dispositionヘッダーに設定されているようです。私はそれを引き出すために正規表現を書きました:

$headers = getallheaders();
$filesize = strlen($file_data);
if(isset($headers['Content-Disposition']) && preg_match('`\bfilename="((?:\\.|[^"])*)"`',$headers['Content-Disposition'], $m)) {
    $filename = urldecode($m[1]);
} else {
    $filename = 'unknown';
}
于 2013-01-02T18:34:55.110 に答える