我目前正在开发一个文件大小上传限制为32 MB的PHP网站(在我不允许更改的php.ini文件中设置),因此我当前的计划是以32 MB的方式解析文件在Javascript中客户端上的块并将这些块上传到我们的PHP服务器,在那里重新组装它们。我使用FileReader API执行此操作,如this post中所述。
但是,我在PHP服务器上收到的文件(在$ _FILES中)的错误0和大小为0,即使我提交的文件大小远低于32 MB。
我的回调函数(在alediafaria的回答代码中用作回调())如下:
var chunkDoneCallback = function(res, filename, count, total_count, filetype) {
var renamedFile = new File([res], count + "_" + total_count + "_" + filename, {type: filetype});
console.log('Filename ' + renamedFile.name + ' (' + renamedFile.size + ' bytes)');
console.log(renamedFile);
var form_data = new FormData();
form_data.append('testfile_chunk', renamedFile);
var req = new XMLHttpRequest();
req.onreadystatechange = function() {//Call a function when the state changes.
if(req.readyState == XMLHttpRequest.DONE && req.status == 200) {
// Request finished. Do processing here.
console.log(req.response);
}
}
req.open("POST", <?php echo "\"".$_SERVER['PHP_SELF']."\"";?>);
req.send(form_data);
}
这表明renamedFile对象具有正确的名称和大小,但PHP端的文件具有正确的名称和0大小。如果我在这里使用完全相同的XMLHttpRequest代码上传原始的完整文件(假设它当然在32 MB以下),它会以正确的大小上传。如果我使用AJAX代替XMLHttpRequest,则会出现相同的错误。
我在网上看到的关于错误0和大小0的每个答案似乎都表明php.ini最大文件大小限制存在问题,但即使是非常小的文件,我也能看到这个问题。我尝试过更小的块大小,更改请求中的MIME类型等等都没有成功。
感觉FileReader的使用方式是一个问题,但我在其文档中看不到与此相关的任何内容。有任何想法吗?谢谢!