截至 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();
};
在我按块上传之前,我会检查这个条件:
file.size > self.leash.settings.upload_max_filesize
常量取自php:
$upload_limit = intval(ini_get('upload_max_filesize')) * 1024 * 1024;