Как стать автором
Обновить

Комментарии 33

Вы забыли выкинуть jQuery React из этого поста.

В web приложениях React занимает достойно положение, с этим надо смирится

Вот и выросло новое поколение джейквери :) Видимо и правда надо просто смириться.

Эммм… а что значит jQuery? Его как бы нет в посте )). Не понимаю в чем проблема, если какая та часть в посте вам не понятна, то я могу по крайней мере постараться вам объяснить

но в посте есть axios

Да, есть )). Но это никак не связано с jQuery. Это гибкая либа для интерактивности с бэком.

А чем обоснован выбор axios? Он же огромный оверхед в мире с fetch и его полифиллом (на крайний случай)

Когда-то было время, когда jQuery пихали во все и везде. jQuery подключали даже чтобы просто атрибут на странице поменять один раз. В статьях — аналогично. «Модуль для jQuery ...» — в котором от jQuery только $(document).ready().

У вас сейчас аналогичная ситуация. «Обработка изображений ReactJS — NodeJS».
Расскажите мне пожалуйста, как React относится к обработке изображений?
Вы подключаете огромный шаблонизатор чтобы отобразить input-file на странице?

Вам хватит обычного fetch и… да и все в общем-то :) Кода будет в половину меньше и никаких зависимостей.

UPD: Я понимаю, что вы его используете потому что «это удобно и вообще че пристали». Просто когда новичек такое видит, он реально начнет на каждый пустяк пихать Реакт. И будет как с jQuery.

React не nodejs, там нет шаблонизатора. Есть формат jsx — функция js по созданию react элемента.
Во первых jQuery — это не React. Это разные вещи. Почему react? Банально, на нем просто пишут все и я в том числе )). Я в принципе тяжело уже представляю фронт без норм фрэймворков и на автоматизме юзаю reactjs, хотя вы правы — это действительно можно было написать и на простом js и реализация не совсем отличалась бы от текущего вида, но зато мы имеем готовый модуль реакт хуки — это сэкономит время для реакт разработчиков

Ну. В общем, запомните этот коммент и вернитесь сюда спустя лет пять разработки. Поймете о чем я говорю :)

Хорошо ))

Автор а почему не сделать обычную отправку файла через стандартный протокол и нативный fetch? зачем все эти танцы с бубном?
var input = document.querySelector('input[type="file"]')

var data = new FormData()
data.append('file', input.files[0])

fetch('/avatars', {
  method: 'POST',
  body: data
})


Тут можно винилу заменить на React, но зато на backend не нужно гемороиться, а заюзать готовые пакеты, типо express-fileupload

Во первых, задача стояла не использовать сторонние либы для бэка )).
Во вторых, вы пробовали сами отправить files[0] в formData без представления его байтов?

но вы же используете на express, тогда уже нужно юзать http.createServer…
да и на сколько помню именно так он в formData отправляется
developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects

Да, вы правы. Но проблема не заключалась написать create http server, проблема заключалась в ключевой части, загрузить изображение непосредственно нативными методами, поэтому этот момент можно отпустить )

Ну и да, тут нет ни строчки про обработку изображения, тем более не строчки про обработку на React, это очередной неудачный пример того, как просто загрузить картинку на сервер

Очень сомневаюсь, что пример указанный вами работает )). Кинь ссылку на песочницу, гляну твой результат. Reactjs — как бы и есть js es6+. Обработка указана и на клиенте и на сервере )). Будьте повнимательнее, а ваш пример нерабочий ))

боюсь что автор ожидает application/json на вход, вместо multipart/form-data
Он вообще ничего не ожидает. Он просто пишет req.body в файл и все тут.
В принципе, это будет работать при любых данных на входе :)

Так ваша реализация рабочая? Или все таки нет? ))

«Обработка» — это можно было бы назвать обработкой если бы изменяли изображение в canvas, накладывали фильтры, делали хоть что то с изображением, но вы всего лишь считали байтики перевели в нужный формат данные и отправили на сервер, это называется загрузка, но никак не обработка и на сервере вы получили данные, конвернули и записали в файлик, где тут обработка?

Почитайте пожалуйста за обработчики во фронтэнде. Судя по вашему мнению на фронте «обработчик» не мыслимое понятие ))

Добавьте в заголовок "Часть 1: Загрузка на сервер" и это решит большинство упоминаемых в комментариях проблем :)

Вообще это странное решение. В сторону велосипеда.
Оптимально это Nginx или аналог который уже умеет оптимально отдавать изображения.
Вам в БД нужна только ссылка или что-то на основании чего можно сгенерировать ссылку.
Так же загрузка реализуется через Nginx, который затем вам отправляет путь по которому сохранено изображение.

Да, все верно. Можно установить в качестве статики указанную директорию в конфигах nginx и пользоваться этим )). Но я предпочитаю пользоваться прокси сервером для выдачи статики на ноде. А так классный вариант, юзал такое

Вам пытаются донести мысль про производительность, ну и сюрприз на 10к+ файлов в одной папке будет вам хорошим напоминании об этой статье
была задача загружать на сервер кучу фоток за раз (600++) с предварительным уменьшением до заданного размера (задавалось на странице, по умолчанию 600*700px). Для ускорения всего процесса фотки были сложены в зип архив 1,5++ Гиг. задача решилась без всякого fw, с применение только одной одной либы zip.js, для распаковки входного файла-архива… отправка простым XMLHttpRequest.
чистый js. серверная часть — любая способная принять XMLHttpRequest.
вот буквально по этому совету habr.com/ru/post/491548/#comment_21368528
Круто )), если грузить все за раз >= 600 картинок.
А причем тут совет? )) У меня проект на react, в любом случае я бы реализовывал эту идею под свой проект. А во-вторых react — это и есть js )

Можно и так:


const url = '/upload-path';
const file = input.files[0];

const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', file.type);
// обрабатываем xhr.onload, xhr.onerror
xhr.send(file);

Или через fetch:


fetch(url, {
 method: 'POST',
 headers: {
   'Content-Type': file.type
  },
  body: file
})

Дополню свой комментарий. Поскольку передаются сырые данные прямо в теле, то для Node.js достаточно (нужно, конечно, еще добавить обработку ошибок и исключений, например, обрыв соединения) выполнить pipe для потоков запроса и файла:


req.pipe(writeFileStream);
Ты избегаешь самую главную часть. Идея заключалась отправить все произвольными байтами ))

А зачем? В моем примере с фронта и так отправляются сырые данные, причем потоково. Вы же сначала грузите весь файл в память (а что если он весит 10 Гб?), а потом отправляете. На стороне Node.js опять же обрабатываете максимально неэффективно — сохраняете целым куском (stream.write(Buffer.from(req.body), 'utf-8')) и преимущества потоков не используются.


Разбивка на байты могла бы пригодиться для реализации возможности докачки, но есть же file.slice.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории