Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   сохрание изображений без использования middleware (https://javascript.ru/forum/node-js-io-js/71053-sokhranie-izobrazhenijj-bez-ispolzovaniya-middleware.html)

svg121 23.10.2017 00:41

сохрание изображений без использования middleware
 
Здравствуйте.
Я хочу сохранить на диск картинки, приходящие POST запросом, без использования middleware like multer, busboy и тд. Хочу разобраться в каком формате приходят каринки на сервер, и как их распарсивать прежде чем сохранять на диск.

На странице есть форма, которая отправляет текстовые поля.
Сами изображения я отправляю по одной при клике на Upload.
Для отправки изображения формирую POST запрос, в теле которого я и передаю изображение.

form(method='POST' action='/building/add' enctype='multipart/form-data')


var uploaded_data = new FormData();
uploaded_data.append("foto", btn_uploadPreviews[0].files[img_index]);

// где btn_uploadPreviews = $(input[type="file"])
// и btn_uploadPreviews[0].files - массив загруженных файлов через 
проводник
// btn_uploadPreviews[0].files[img_index] - берём конкретное изображение по индексу

      $.ajax({
        type: 'POST',
        url: '/building/add',
        data: uploaded_data,
        processData: false,
        contentType: false,
        success: function(data){
          console.log(data);
        },
        error: function(){
          console.log('error');
        }
      });


На серваке, проблема состоит в том, что картинка приходит в виде бинарных данных, среди которых есть такие данные как ------WebKitFormBoundaryAv4xbzebt3AYoGsv
И если вывести в консоль кусок данных через chunk.toString(),
то картинка выводится как символы + метаданные ------WebKitFormBoundaryAv4xbzebt3AYoGsv, Content-Type и тд.

subapp.post('/building/add', function(req, res){

        var newImage = fs.createWriteStream('uploads/newImage.jpg');
        console.log(req.headers);

        var data = ' ';
        req.on('data', function(chunk){
            data += chunk;
            console.log(chunk.toString());
        });

        req.on('end', function(){
            res.send(data);
        });

});


https://drive.google.com/file/d/0B7r...ew?usp=sharing
https://drive.google.com/file/d/0B7r...ew?usp=sharing

Как можно удалить эти метаданные перед сохранением картинки?
И в каком формате должна находится картинка чтоб удалять эти метаданные. Нужно ли кусок считываемых данных хранить в переменной Buffer или просто в строковой переменной?

Заранее огромное спасибо.

Alexandroppolus 23.10.2017 03:56

svg121,
Отправляй файл, а не ФормДату. Тогда картинка придёт как есть и ты сможешь запросто её сохранить методом pipe https://nodejs.org/dist/latest-v8.x/...tion_optio ns , и это будет круто, максимально эффективно, без говнокода и вспомогательных библиотек.

А так приходит формдата, в которой есть разделители и прочее (см. multipart/form-data), её парсить надо. Эта штука нужна, если отправляешь доп. данные, или несколько файлов. Для отправки одного файла нафиг не надо.

svg121 23.10.2017 23:57

Alexandroppolus, спасибо большое за совет, сохраняет.
А имя изображения (или путь) я передаю через формирование кастомного заголовка для Post-a.
На будущее буду пытаться распарсивать мульпарт для сохранения нескольких изображений.

Alexandroppolus 24.10.2017 00:37

svg121,
Есть готовые библиотеки парсинга мультипарта, задача-то типовая.
И конечно, это более ресурсоемкая операция для ноды. Даже если надо сохранить несколько файлов, то лучше отдельными запросами каждый файл, чем одной формдатой.


Часовой пояс GMT +3, время: 02:11.