Как распаковать zip-файл, содержащий несколько файлов, и отправить эти файлы в загрузчик Dropzone? - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь распаковать файл и отправить несжатые файлы, которые были внутри, обратно в 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)}
...