Как извлечь Content-Type из файла, отправленного через multipart/form-data
Я получил запрос от своего работника 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. Я что-то пропустил?
Обновление: если вы знаете сыворотку для достижения этого в Node.js, это также будет полезно.
1 ответ
К сожалению, на момент написания этой статьи реализация FormData в Cloudflare Workers является неполной и не позволяет извлечь Content-Type. На самом деле, похоже, что наша реализация в настоящее время интерпретирует все записи как текст и возвращаемые строки, что означает, что двоичное содержимое будет повреждено. Эта ошибка требует исправления, поскольку мы не хотим нарушать уже развернутые сценарии, которые могут зависеть от поведения ошибки.
Спасибо Кентон за ваш ответ.
Что я в итоге сделал:
Поскольку работники Cloudflare не поддерживают multipart/form-data
Blob или любого другого типа, кроме String, я использовал необработанные байты в ArrayBuffer
тип данных. После преобразования его в Uint8Array
Я анализировал его побайтово, чтобы определить тип файла и начальный и конечный индексы данных файла. Как только я нашел начало и конец переданного файла, я смог создать массив данных файла, добавить его в запрос и отправить его в GCS, как я показал выше.