簡體   English   中英

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

[英]How to extract the Content-Type of a file sent via multipart/form-data

我在我的 cloudflare 工作器中收到一個請求,並希望將數據上傳到 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 工作器代碼的一部分。

在我看來,這應該是直截了當的,確定您從 multipart/form-data 數據中提取的文件類型。 我錯過了什么嗎?

不幸的是,在撰寫本文時,FormData 的 Cloudflare Workers 實現尚不完整,並且不允許提取 Content-Type。 事實上,我們的實現目前似乎將所有條目解釋為文本並返回字符串,這意味着二進制內容將被破壞。 這是一個需要小心修復的錯誤,因為我們不想破壞可能依賴於錯誤行為的已經部署的腳本。

感謝肯頓的回復。

我最終做了什么:

由於 Cloudflare Workers 不支持 Blob 的multipart/form-data或 String 以外的任何類型,我最終使用了ArrayBuffer數據類型中的原始字節。 將其轉換為Uint8Array我逐字節解析它以確定文件類型以及文件數據的開始和結束索引。 找到傳輸文件的開頭和結尾后,我就可以創建文件數據數組,將其添加到請求中並將其發送到 GCS,如上所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM