Извлеките файл изображения из zip-файла в node.js и загрузите файл на сервер

Я хочу, чтобы мои пользователи выбирали в браузере zip-файл, содержащий файлы изображений. Затем я просматриваю zip-файл и выбираю, какие файлы изображений отправлять на удаленный сервер (где они обрабатываются и т. д.). Это отлично работает для загрузки zip-файла и идентификации файлов в нем. Я выбираю файл с помощью

    <input type="file"> 

элемент; Я прочитал его в виде zip-файла, используя отличную библиотеку JSZip:

    var zip = new JSZip();
    zip.loadAsync("file selected in browser")

Затем я идентифицирую zip-файлы в этом файле:

    for (var key in zip.files) {
      var myFile=zip.files[key]; }

Теперь с помощью JSZip я могу извлечь каждый сжатый файл:

    zip.files["key for this file"].async("base64").then(function (myImage) {
      //send this image to a remote server as if it were a file
    });

Проблема с последним шагом. Я не могу подобрать правильную комбинацию вызовов, параметров и т. д., чтобы правильно загрузить это. Кажется очевидным, что нужно создать объект formData и отправить его оттуда, поэтому:

    var fd = new FormData();                  
    fd.append("file", myImage);

а затем опубликовать его ajax:

    $.ajax({
        type: 'POST',
        url: url,
        enctype: 'multipart/form-data',
        contentType: false,
        dataType: false,
        processData: false,
        data: fd,
    }).done(function(data){
       //do something with returned data
    })

Однако это не работает на стороне сервера (хотя тот же файл, отправленный на тот же адрес из формы, работает нормально). Что мне не хватает? Или я не могу сделать это с помощью $.ajax (или http-модуля npm) и должен использовать что-то более низкоуровневое, например модуль запроса npm?

Помощь!


person Peter Robinson    schedule 19.11.2017    source источник


Ответы (1)


Хорошо, разобрался. В основном методом проб и (в основном) ошибок, но вот что работает. Во-первых, вам нужно извлечь файл из zip-файла как «большой двоичный объект», поэтому:

zip.files["key for this file"].async("blob").then(function (myImage) {
  //send this image to a remote server as if it were a file
});

Затем, когда у вас есть большой двоичный объект, вы должны встроить его в ДРУГОЙ большой двоичный объект следующим образом:

var blob = new Blob([myImage], { type: "image/jpeg"});

Затем вы создаете новый объект FormData и добавляете к нему наш новый файловый двоичный объект:

var fd = new FormData();
fd.append('file', blob, 'myFile.jpg');  

И затем вы вызываете $.ajax (если вы используете jquery), поэтому:

$.ajax({
  type: 'POST',
  url: url,
  enctype: 'multipart/form-data',
  contentType: false,
  dataType: false,
  processData: false,
  data: fd,
})
 .done (function(data){
   //do something with the success
})

И это прекрасно работает. Честно говоря, кажется очень странным вставлять каплю в каплю, но это работает, так что вот.

person Peter Robinson    schedule 20.11.2017