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