我想知道是否可以通过以下方式上传一个非常大的文件(超过60MB左右..)
这可能吗?
我想要做的是克服php对我的服务器上可用/允许的最大上传文件大小的限制 - 我知道你可以配置php ini和apache的东西,但我不是管理员,他不能这样做我公司内部的安全原因..
答案 0 :(得分:2)
这是可能的,但仅限于某些浏览器。 Here's the documentation on the file api。我不相信IE6-8支持这一点。因此,当我需要这样做时,我必须编写前端,将块发送到闪存中的服务器。
答案 1 :(得分:0)
从2018年开始,有JavaScript API,首先需要使用Blob.slice或其前缀版本对文件进行切片,然后使用FormData发送块。服务器需要将块附加到文件的末尾,因此在您启动之前,您需要删除旧文件(如果存在)。
在我的项目中,我使用此代码:
Uploader.prototype.upload_by_chunks = function upload_by_chunks(file, path, chunk_size) {
var self = this;
chunk_size = chunk_size || 1048576; // 1MB
var defered = $.Deferred();
function slice(start, end) {
if (file.slice) {
return file.slice(start, end);
} else if (file.webkitSlice) {
return file.webkitSlice(start, end);
}
}
var i = 0;
function process(start, end) {
if (start < file.size) {
var chunk = slice(start, end);
var formData = new FormData();
formData.append('file', chunk, file.name);
formData.append('token', self.token);
formData.append('path', path);
$.ajax({
url: 'lib/upload.php?append=1',
type: 'POST',
success: function(response) {
if (response.error) {
self.error(response.error);
defered.reject();
} else {
process(end, end+chunk_size);
}
},
error: function(jxhr, error, status) {
self.error(jxhr.statusText);
defered.reject();
},
data: formData,
cache: false,
contentType: false,
processData: false
});
} else {
self.leash.terminal.echo('File "' + file.name + '" uploaded.');
defered.resolve();
}
}
var fname = path + '/' + file.name;
this.leash.service.unlink(self.token, fname)(function(err, del) {
if (err) {
self.error(err);
defered.reject();
} else {
process(0, chunk_size);
}
});
return defered.promise();
};
在我通过chunk上传之前,我检查了这个条件:
file.size > self.leash.settings.upload_max_filesize
常量取自php:
$upload_limit = intval(ini_get('upload_max_filesize')) * 1024 * 1024;