Браузер автоматически не устанавливает заголовок типа содержимого запроса для FormData с выборкой

#javascript #multipartform-data #fetch-api #form-data

#javascript #multipartform-данные #fetch-api #форма-данные

Вопрос:

Я пытаюсь загрузить файл с помощью FormData, но сервер не получает данные.

После ряда сообщений и блогов, которые завершают настройку заголовка типа содержимого, поскольку multipart / form-data переопределяет требуемый формат, включающий «границу», я удалил заголовок типа содержимого, предполагая, что мой браузер будет обрабатывать заголовок типа содержимого запроса. Интернет переполнен этим решением для formdata, но я не смог найти ни одного случая, когда браузер автоматически не устанавливает тип содержимого при использовании FormData. Мой сервер работает нормально, потому что я могу успешно отправлять запросы от REST-клиента.

Это мой вызов API :

 const data = new FormData()
data.append('file', this.state.selectedFile)

const result = await fetch("http://localhost:3000/uploadResume", {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${localStorage.getItem('user_token')}`
            },
            data: data
        })
  

Это заголовки запроса, установленные браузером (Google Chrome) :

введите описание изображения здесь

Есть ли параметр браузера, который мне не хватает, или другая потенциальная проблема, которую я упускаю из виду?

РЕШАЕМАЯ я вызвал API с набором данных как «данные» вместо «тела» по ошибке.

Ответ №1:

объект запроса ожидает body свойство

     fetch(url, {
        // data: data <-- wrong
        body: data // <-- correct
    })
  

Не по теме

судя по небольшому объему данных, которые вы отправляете (всего одно поле / файл), вы могли бы просто опубликовать данные в виде необработанных байтов вместо того, чтобы они были FormData (что немного облегчает серверу передачу данных в файл и не требует обработки какого-либо алгоритма FormData) вы бы заранее знали, насколько велик файл при его получении.

     fetch(url, {
        body: this.state.selectedFile
    })
  

в общем, вы теряете имя файла, но, возможно, вы можете просто вставить его в какой-нибудь заголовок x-filename

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

1. Привет, спасибо, что указали на это. После всего мозгового штурма это глупая ошибка! Я согласен с вашим предложением о публикации необработанных байтов. Спасибо!