【问题标题】:How to extract the Content-Type of a file sent via multipart/form-data如何提取通过 multipart/form-data 发送的文件的 Content-Type
【发布时间】:2019-05-27 09:15:15
【问题描述】:

我在我的 cloudflare worker 中收到一个请求,并希望将数据上传到 Google 云存储。我的问题是我无法从收到的 multipart/form-data 数据中提取内容类型,以便将具有正确内容类型的内容上传到 GCS。

当我使用 await req.formData() 读取请求时,我可以从 formData 中 get('file') 并返回 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 worker 代码的一部分。

在我看来,这应该是直截了当的,确定您从 multipart/form-data 数据中提取的文件类型。 我错过了什么吗?

【问题讨论】:

  • Content-type http 的标头将是 multipart/form-data。当您提到文件类型时,您是在谈论 .jpg .png 等文件扩展名吗?
  • 是的,请求内容类型是mulipart/form-data 我想要的是在表单数据中发送的文件数据的类型。它可以是任何文件类型。问题是,在 cloudflare 中,我没有 Blob 对象,我相信它会在节点服务器场景中捕获文件类型。
  • 你认为从文件名读取文件扩展名是你的选择吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢肯顿的回复。

    我最终做了什么:

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

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多