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 的文件中。我不确定这是一个通用常量还是特定于我的服务器的配置方式。

不过,我想出了如何绕过这个限制。您需要设置singleFileUploads为假,true例如multipart

$('#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 回答