Как извлечь Content-Type из файла, отправленного через multipart / form-data

1

Я получил запрос от своего работника cloudflare и хочу загрузить данные в облачное хранилище Google. Моя проблема в том, что я не могу извлечь тип содержимого из данных multipart/form-data, которые я получаю, чтобы загрузить его с правильным типом содержимого в GCS.

Когда я читаю запрос с помощью await req.formData() я могу get('file') из formData, и он возвращает необработанные данные файла, которые мне нужны для GCS, но я не могу нигде увидеть содержимое файла - тип, который мне нужен (я вижу его только при просмотре необработанного тела запроса).

Вот мой (суженный) код:

event.respondWith((async () => {
  const req = event.request
  const formData = await req.formData()
  const file = formData.get('file')
  const filename = formData.get('filename')
  const oauth = await getGoogleOAuth()
  const gcsOptions = {
    method: 'PUT',
    headers: {
      Authorization: oauth.token_type + ' ' + oauth.access_token,
      'Content-Type': 'application/octet-stream' //this should by ''Content-Type': file.type'
    },
    body: file,
  }
  const gcsRes = await fetch(
    'https://storage.googleapis.com/***-media/${filename}',
    gcsOptions,
  )
  if (gcsRes.status === 200) {
    return new Response(JSON.stringify({filename}), gcsRes)
  } else {
    return new Response('Internal Server Error', {status: 500, statusText: 'Internal Server Error'})
  }
})())

Напоминание - код является частью нашего рабочего кода cloudflare.

Мне кажется, это должно быть прямо, определяя тип файла, который вы извлекаете из данных multipart/form-data. Я что-то пропустил?

  • 0
    Заголовок Content-type http будет multipart/form-data . Вы говорите о расширениях файлов, таких как .jpg .png и т. Д., Когда упоминаете тип файла?
  • 0
    Да, тип содержимого запроса - это mulipart/form-data Мне нужен тип данных файла, который отправляется в форме данных. Это может быть файл любого типа. Проблема в том, что в cloudflare у меня нет объекта Blob, который, как я полагаю, захватил бы тип файла в cenario сервера узлов.
Показать ещё 1 комментарий
Теги:
http
multipartform-data

2 ответа

0
Лучший ответ

Спасибо Кентон за ваш ответ.

Что я в итоге сделал:

Поскольку Cloudflare Workers не поддерживают multipart/form-data объекта Blob или любого другого типа, кроме String, я в конечном итоге использовал необработанные байты в ArrayBuffer данных ArrayBuffer. После преобразования его в Uint8Array я анализировал его побайтно, чтобы определить тип файла, а также начальный и конечный индексы данных файла. Как только я нашел начало и конец переданного файла, я смог создать массив данных файла, добавить его в запрос и отправить его в GCS, как я показал выше.

0

К сожалению, на момент написания этой статьи реализация FormData в Cloudflare Workers является неполной и не позволяет извлечь Content-Type. На самом деле, похоже, что наша реализация в настоящее время интерпретирует все записи как текст и возвращаемые строки, что означает, что двоичное содержимое будет повреждено. Это ошибка, которую необходимо исправить, поскольку мы не хотим ломать уже развернутые сценарии, которые могут зависеть от ошибочного поведения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню