Вы можете использовать JSZip .Для ввода он поддерживает String / ArrayBuffer / Uint8Array / Buffer , но not blob
s, то есть то, что вы получаете от <input type="file"/>
с javascript:
Объект File - это особый вид Blob, и его можно использовать в любом контексте, который может использовать Blob
(ссылка)
Итаквам нужно сначала конвертировать BLOB-файл / файл, например, в ArrayBuffer, например, используя FileReader.readAsArrayBuffer()
.Обратите внимание, что эта функция работает асинхронно, требуя использования обратного вызова.Также имеется FileReaderSync , однако «Этот интерфейс доступен только для рабочих, поскольку он позволяет синхронный ввод-вывод, который потенциально может блокировать», поэтому я не вижу никакого смысла в его использовании.
( РЕДАКТИРОВАТЬ. Я не уверен, но я думаю, что вы можете пропустить преобразование blob-> ArrayBuffer сейчас и просто сжать объект File. )
Весь этот подход особенно полезенесли директива php max_file_uploads
была установлена на небольшое число вашим хостом веб-пространства, на данный момент вам нужно беспокоиться только о upload_max_filesize
Для справки ниже приведен пример кода (с использованием JQuery
) для помещения нескольких файлов из одного multiple
файла, введенного в zip перед отправкой:
// onclick:
var fileInput = $(':file');
var files = [];
$.each(fileInput[0].files, function(i, file) {
files.push(file);
});
var zip = new JSZip();
function addFileToZip(n) {
if(n >= files.length) {
zippingComplete(zip.generate({type:"blob", compression:"deflate"}));
return;
}
var file = files[n];
var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function() {
arrayBuffer = this.result;
zip.file(file.name, arrayBuffer);
addFileToZip(n + 1);
};
fileReader.readAsArrayBuffer(file);
}
addFileToZip(0);
function zippingComplete(zip) {
formData = new FormData();
formData.append('fileZip', zip);
formData.append("param1", "blah");
$.ajax({
data: formData,
//... etc
Со стороны сервера выдоступ $_FILES["fileZip"]
.