如何提取通过multipart / form-data发送的文件的Content-Type

时间:2018-12-30 11:37:34

标签: javascript node.js http multipartform-data cloudflare-workers

我在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数据中提取的文件类型。 我想念什么吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,截至撰写本文时,FormData的Cloudflare Workers实现不完整,并且不允许提取Content-Type。实际上,似乎我们的实现当前将所有条目解释为文本并返回字符串,这意味着二进制内容将被破坏。由于我们不想破坏可能依赖于错误行为的已部署脚本,因此需要谨慎修复此错误。

答案 1 :(得分:0)

感谢肯顿的答复。

我最终要做的事情:

由于Cloudflare Workers不支持Blob的multipart/form-data或String以外的任何类型,因此我最终使用了ArrayBuffer数据类型中的原始字节。将其转换为Uint8Array后,我逐字节解析它以确定文件类型以及文件数据的开始和结束索引。找到传输文件的开始和结束后,就可以创建文件数据数组,将其添加到请求中,然后将其发送到GCS,如上所示。