我在cloudflare工作者中收到一个请求,并想将数据上传到Google云存储。我的问题是我无法从接收到的multipart / form-data数据中提取内容类型,以将正确的内容类型上传到GCS。
当我用await req.formData()
读取请求时,我可以从formData中get('file')
并返回GCS所需的原始文件数据,但似乎看不到文件内容的任何地方-我需要的类型(只有在查看原始Request正文时才能看到它)。
这是我的(简化的)代码:
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 :(得分:1)
不幸的是,截至撰写本文时,FormData的Cloudflare Workers实现不完整,并且不允许提取Content-Type。实际上,似乎我们的实现当前将所有条目解释为文本并返回字符串,这意味着二进制内容将被破坏。由于我们不想破坏可能依赖于错误行为的已部署脚本,因此需要谨慎修复此错误。
答案 1 :(得分:0)
感谢肯顿的答复。
我最终要做的事情:
由于Cloudflare Workers不支持Blob的multipart/form-data
或String以外的任何类型,因此我最终使用了ArrayBuffer
数据类型中的原始字节。将其转换为Uint8Array
后,我逐字节解析它以确定文件类型以及文件数据的开始和结束索引。找到传输文件的开始和结束后,就可以创建文件数据数组,将其添加到请求中,然后将其发送到GCS,如上所示。