Рубрики
Без рубрики

Обработка загрузки файлов в формах с помощью экспресс-

Как управлять хранением и обработкой файлов, загруженных с помощью форм, в Express

Это пример HTML-формы, которая позволяет пользователю загружать файл:

Не забудьте добавить enctype="составные/данные формы" в форму или файлы не будет загружено

Когда пользователь нажимает кнопку “Отправить”, браузер автоматически отправит сообщение запрос на /форму отправки URL-адрес в том же источнике страницы. Браузер отправляет содержащиеся в нем данные, закодированные не как в обычной форме приложение/x-www-форма-urlencoded , а как составные/данные формы .

На стороне сервера обработка составных данных может быть сложной и подверженной ошибкам, поэтому мы собираемся использовать служебную библиотеку под названием грозный . Вот репозиторий GitHub , он имеет более 4000 звезд и находится в хорошем состоянии.

Вы можете установить его с помощью:

npm install formidable

Затем включите его в свой Node.js файл:

const express = require('express')
const app = express()
const formidable = require('formidable')

Теперь в конечной точке POST на маршруте /форма отправки мы создаем экземпляр новой грозной формы, используя грозный. Входящая форма() :

app.post('/submit-form', (req, res) => {
  new formidable.IncomingForm()
})

После этого мы должны иметь возможность проанализировать форму. Мы можем сделать это синхронно, предоставив обратный вызов, что означает, что все файлы обработаны, и как только это будет сделано, они станут доступными:

app.post('/submit-form', (req, res) => {
  new formidable.IncomingForm().parse(req, (err, fields, files) => {
    if (err) {
      console.error('Error', err)
      throw err
    }
    console.log('Fields', fields)
    console.log('Files', files)
    for (const file of Object.entries(files)) {
      console.log(file)
    }
  })
})

Или вы можете использовать события вместо обратного вызова. Например, получать уведомления о том, когда каждый файл анализируется, или о других событиях, таких как завершение обработки файла, получение поля, не относящегося к файлу, или если произошла ошибка:

app.post('/submit-form', (req, res) => {
  new formidable.IncomingForm().parse(req)
    .on('field', (name, field) => {
      console.log('Field', name, field)
    })
    .on('file', (name, file) => {
      console.log('Uploaded file', name, file)
    })
    .on('aborted', () => {
      console.error('Request aborted by the user')
    })
    .on('error', (err) => {
      console.error('Error', err)
      throw err
    })
    .on('end', () => {
      res.end()
    })
})

Какой бы способ вы ни выбрали, вы получите один или несколько грозных. Файловые объекты, которые предоставляют вам информацию о загруженном файле. Вот некоторые из методов, которые вы можете вызвать:

  • Вот некоторые из методов, которые вы можете вызвать: file.size , размер файла в байтах
  • Вот некоторые из методов, которые вы можете вызвать: file.size , размер файла в байтах.путь
  • , путь, по которому записывается файл Вот некоторые из методов, которые вы можете вызвать: file.size
  • , размер файла в байтах.путь , путь, по которому файл записывается в файл.имя

Путь по умолчанию относится к временной папке и может быть изменен, если вы прослушаете событие начало файла :

app.post('/submit-form', (req, res) => {
  new formidable.IncomingForm().parse(req)
    .on('fileBegin', (name, file) => {
        file.path = __dirname + '/uploads/' + file.name
    })
    .on('file', (name, file) => {
      console.log('Uploaded file', name, file)
    })
    //...
})

Оригинал: “https://flaviocopes.com/express-forms-files/”