Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.10.2017, 00:41
Новичок на форуме
Отправить личное сообщение для svg121 Посмотреть профиль Найти все сообщения от svg121
 
Регистрация: 23.10.2017
Сообщений: 2

сохрание изображений без использования 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 или просто в строковой переменной?

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

Последний раз редактировалось svg121, 23.10.2017 в 00:44.
Ответить с цитированием
  #2 (permalink)  
Старый 23.10.2017, 03:56
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

А так приходит формдата, в которой есть разделители и прочее (см. multipart/form-data), её парсить надо. Эта штука нужна, если отправляешь доп. данные, или несколько файлов. Для отправки одного файла нафиг не надо.
Ответить с цитированием
  #3 (permalink)  
Старый 23.10.2017, 23:57
Новичок на форуме
Отправить личное сообщение для svg121 Посмотреть профиль Найти все сообщения от svg121
 
Регистрация: 23.10.2017
Сообщений: 2

Alexandroppolus, спасибо большое за совет, сохраняет.
А имя изображения (или путь) я передаю через формирование кастомного заголовка для Post-a.
На будущее буду пытаться распарсивать мульпарт для сохранения нескольких изображений.
Ответить с цитированием
  #4 (permalink)  
Старый 24.10.2017, 00:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

Последний раз редактировалось Alexandroppolus, 24.10.2017 в 00:55.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
эмуляция события resize для элемента без использования фрейма (scroll-based?) danik.js Events/DOM/Window 1 08.04.2013 13:58
Вычесть один массив из другого без использования цикла Casufi Общие вопросы Javascript 1 16.01.2013 20:21
Прогрузка изображений по селект в том же окне без обновления страницы arturfjodrv Библиотеки/Тулкиты/Фреймворки 2 05.04.2012 16:45
Загрузка файла без использования формы Slavenin AJAX и COMET 20 12.12.2010 12:41
Автоматическая отправка формы через JavaScript без использования body onload pavluxa09 Общие вопросы Javascript 0 17.11.2009 15:55