Я пытаюсь распаковать файл и отправить несжатые файлы, которые были внутри, обратно в dropzone uploader
У меня есть многофайловый загрузчик, использующий Dropzone.js.Это работает на удивление хорошо для нескольких файлов, однако я пытаюсь заставить его извлечь (распаковать) zip-файл, а затем взять содержимое этого zip-файла и снова отправить его обратно в загрузчик Dropzone.js.
Я попытался использовать zip.js и JSZip, и я дошел до того, что я получаю объекты BLOB-объектов или (рабочие), но тогда я понятия не имею, как заставить их вернуться в загрузчик, как будто я выбрал «Загрузить»"и схватил файлы и бросил их в.
Загрузчик Dropzone отправляет при отбрасывании / выборе файла.Возможно, я просто не заинтересован в том, как процесс распаковки работает в браузере, или если то, что я пытаюсь сделать, вообще можно сделать ??
Я собираюсь сделать это на стороне браузера, чтобы использовать некоторую мою логикуу меня уже есть время для загрузки и время обработки, когда файл попадает на наш сервер.
Дайте мне знать, если есть что-то еще, что мне нужно добавить, в основном смешивая просто код dropzone.js с кодом zip.js длявыполнить то, что я ищу.Заранее спасибо!
пример:
var mediaDropzone = new Dropzone("#media-dropzone", {
dictDefaultMessage: "Click or Drop files here to upload",
dictInvalidFileType: "You can't upload files of this type.",
});
Dropzone.options.mediaDropzone = false;
mediaDropzone.options.acceptedFiles = ".csv,.xls,.xlsx,.txt,.zip";
mediaDropzone.on("sending", function(files, xhr, formData){
if (files.type === "application/zip"){
console.log(jQuery.type(files));
unzipBlob(files, function(unzippedBlob) {
// logs the uncompressed Blob
console.log(unzippedBlob);
});
this.removeFile(files)
}
formData.append("fileuuid", files.upload.uuid);
});
mediaDropzone.on("complete", function(files) {
var _this = this;
setTimeout(function(){
var acceptedFiles = _this.getAcceptedFiles();
var rejectedFiles = _this.getRejectedFiles();
for(var index = 0; index < acceptedFiles.length; index++) {
var file = acceptedFiles[index];
console.log(jQuery.type(file));
if (file.status == "success") {
appendContent(file.status, file.name, file.upload.uuid);
_this.removeFile(file)
}
}
if(acceptedFiles.length != 0) {
alertify.success('Uploaded ' + acceptedFiles.length + ' files successfully.');
}
if(rejectedFiles.length != 0) {
alertify.error('Error uploading ' + rejectedFiles.length + ' files.');
}
}, 2000);
});
});
function unzipBlob(blob, callback) {
// use a zip.BlobReader object to read zipped data stored into blob variable
zip.createReader(new zip.BlobReader(blob), function(zipReader) {
// get entries from the zip file
zipReader.getEntries(function(entries) {
// get data from the first file
console.log(entries.length);
for(var index = 0; index < entries.length; index++) {
var file = entries[index];
file.getData(new zip.BlobWriter("text/plain"), function(data) {
// close the reader and calls callback function with uncompressed data as parameter
console.log("DATA::: " + data.data());
zipReader.close();
callback(data);
});
};
});
}, onerror);
}
Если у кого-то еще возникла такая же проблема, я после некоторого исследования нашел решение.Надеюсь, это кому-нибудь еще поможет!
if (files.type === "application/zip"){
var zip = new JSZip();
zip.loadAsync( files /* = file blob */)
.then(function(zip) {
return jQuery.map(Object.keys(zip.files), function(filename) {
return zip.files[filename].async('blob').then(function (fileData) {
if (filename.includes("_MAC")){
void(0)
} else {
var bloblextracted = new File([fileData], filename);
mediaDropzone.addFile(bloblextracted);
}
})
})
}, function() {alert("Not a valid zip file")});
this.removeFile(files)
void(0)}