javascript FileReader 上传 'Request Entity Too Large'
javascript FileReader upload 'Request Entity Too Large'
我正在尝试解决通过 Chrome 中的 ajax 上传时从请求中删除文件的问题。
当删除或浏览文件时,我使用 FileReader 准备文件:
// initialise fileListData array
fileListData = new Array(fileList.length);
// start reading files
for (var i=0; i<fileList.length; i++) {
// update fileListData file status
fileListData[i] = { 'name': fileList[i].name, 'processing' : 1 };
// read file
var fileReader = new FileReader();
fileReader.onload = (function(idx) {
return function(e) {
// update fileListData data
setFilesAreReady(idx, e.target.result);
}
})(i);
fileReader.readAsDataURL(fileList[i]);
}
方法setFilesAreReady
只是将FileReader的结果存储到fileListData数组中,然后检查数组中的所有项目是否完成处理(以便它可以启用上传按钮)。
文件读取完成后,上传按钮启用,点击上传开始发出 ajax 请求:
if (is_chrome || is_safari) {
formData.append('upfile_0', ajax_uploads[file_idx].fileData);
console.log(ajax_uploads[file_idx].fileData);
} else {
formData.append('upfile_0', file);
}
formData.append('event', eventVal);
formData.append('filePrivacy', filePrivacyVal);
首先我编译了一个 formData 对象,然后将其与请求一起提交:
// start upload
jQuery.ajax(
{
data: formData,
url: path_to_upload_script + '?upload_id=' + upload_id,
type: "POST",
processData: false,
contentType: false,
error:
function (jqXHR, textStatus, errorThrown)
{
...
},
success:
function (response)
{
...
}
});
// start ajax progress
initialiseAjaxProgressBar(upload_id);
}
我遇到的问题是,如果上传的文件超过几兆字节,则会出现此 Request Entity Too Large
错误:
但服务器实际上配置为接受最大 250MB 的文件。我正在使用 Uber 上传器(perl 脚本),它可以处理大文件上传。 ajax 上传适用于 firefox 和 internet explorer 中的大文件,因此此 FileReader 解决方法仅适用于 chrome(和 safari)。
我猜发生此错误是因为内容类型错误,因为我上传的是数据字符串而不是 js 文件对象。
如何使用我在 ajax 请求中附加到 formData 的其他参数正确上传 FileReader 结果(看起来像:data:video/mp4;base64,...
)?
最后我使用了这个名为 plupload 的不错的库。它将文件拆分为 1mb 的块以解决请求实体太大的问题。该文件在服务器上重建。这也允许非常大的上传,因为您不会超过 PHP 的每个块的 post 最大大小。
我正在尝试解决通过 Chrome 中的 ajax 上传时从请求中删除文件的问题。
当删除或浏览文件时,我使用 FileReader 准备文件:
// initialise fileListData array
fileListData = new Array(fileList.length);
// start reading files
for (var i=0; i<fileList.length; i++) {
// update fileListData file status
fileListData[i] = { 'name': fileList[i].name, 'processing' : 1 };
// read file
var fileReader = new FileReader();
fileReader.onload = (function(idx) {
return function(e) {
// update fileListData data
setFilesAreReady(idx, e.target.result);
}
})(i);
fileReader.readAsDataURL(fileList[i]);
}
方法setFilesAreReady
只是将FileReader的结果存储到fileListData数组中,然后检查数组中的所有项目是否完成处理(以便它可以启用上传按钮)。
文件读取完成后,上传按钮启用,点击上传开始发出 ajax 请求:
if (is_chrome || is_safari) {
formData.append('upfile_0', ajax_uploads[file_idx].fileData);
console.log(ajax_uploads[file_idx].fileData);
} else {
formData.append('upfile_0', file);
}
formData.append('event', eventVal);
formData.append('filePrivacy', filePrivacyVal);
首先我编译了一个 formData 对象,然后将其与请求一起提交:
// start upload
jQuery.ajax(
{
data: formData,
url: path_to_upload_script + '?upload_id=' + upload_id,
type: "POST",
processData: false,
contentType: false,
error:
function (jqXHR, textStatus, errorThrown)
{
...
},
success:
function (response)
{
...
}
});
// start ajax progress
initialiseAjaxProgressBar(upload_id);
}
我遇到的问题是,如果上传的文件超过几兆字节,则会出现此 Request Entity Too Large
错误:
但服务器实际上配置为接受最大 250MB 的文件。我正在使用 Uber 上传器(perl 脚本),它可以处理大文件上传。 ajax 上传适用于 firefox 和 internet explorer 中的大文件,因此此 FileReader 解决方法仅适用于 chrome(和 safari)。
我猜发生此错误是因为内容类型错误,因为我上传的是数据字符串而不是 js 文件对象。
如何使用我在 ajax 请求中附加到 formData 的其他参数正确上传 FileReader 结果(看起来像:data:video/mp4;base64,...
)?
最后我使用了这个名为 plupload 的不错的库。它将文件拆分为 1mb 的块以解决请求实体太大的问题。该文件在服务器上重建。这也允许非常大的上传,因为您不会超过 PHP 的每个块的 post 最大大小。