следующий. js загрузка файла через API-маршруты / грозный - не работает - PullRequest
3 голосов
/ 01 февраля 2020

У меня чертовски непросто заставить загрузку файлов работать через API-маршруты.

На стороне клиента я отправляю файл примерно так:

 onFormSubmit = (e) => {
    e.preventDefault() // Stop form submit

    this.fileUpload(this.state.file).then((response) => {
      console.log('rD', response.data)
    })
 }

 onFileChange = (e) => {
    this.setState({ file: e.target.files[0] })
 }

 fileUpload = (file) => {
    const url = '/api/mail/upload'
    const formData = new FormData()
    formData.append('file', file)
    const config = {
      headers: {
        'X-CSRF-TOKEN': this.props.session.csrfToken
      }
    }
    return axios.post(url, formData, config)
 }

Мой запрос /api/mail/upload затем выглядит следующим образом:

Request Headers:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,de-DE;q=0.8,de;q=0.7
Connection: keep-alive
Content-Length: 1331
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBlNt6z8t4rGZT0x6
Cookie: abc123
Host: localhost:3000
Origin: http://localhost:3000
Referer: http://localhost:3000/new
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
X-CSRF-TOKEN: abc123

Form Data:
file: (binary)

Затем в маршруте (/ api / mail / upload) я пытаюсь использовать формула для анализа данных формы и, наконец, что-то сделать с файлом.

Я убедился, что отключил встроенный синтаксический анализатор тела, добавив следующее в конец файла маршрута API:

export const config = {
  api: {
    bodyParser: false
  }
}

^^ Это правильный способ сделать это, да?

Наконец, на маршруте API я пробовал много разных вещей, но в настоящее время я ожидаю, что сработает следующее, но это не так.

module.exports = async (req, res) => {
  const form = new formidable.IncomingForm()

  form.parse(req, (err, fields, files) => {
    if (err) return reject(err)
    console.log(fields, files)
    res.status(200).json({ fields, files })
  })
  // if I console.log(form) here - I can see the request details, so it seems to be picking that up
}

Это не генерирует никакого вывода на стороне сервера или на стороне клиента, я ожидаю, что console.log(fields, files) выведет на стороне сервера имя файла, et c.

Кто-нибудь знает, кто я отсутствует

...