Как извлечь Content-Type из файла, отправленного через multipart / form-data - PullRequest
0 голосов
/ 30 декабря 2018

Я получаю запрос от своего работника облачного хранилища и хочу загрузить данные в облачное хранилище 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.Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

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

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

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

0 голосов
/ 08 января 2019

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

...