You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展中Service Worker向Firebase传输大文件失败求助

Chrome扩展Service Worker上传4MB MP3至Firebase Storage失败排查

问题现象

  • 上传KB级小型MP3文件至Firebase Storage可成功
  • 上传4MB MP3文件时触发未知错误
  • 同一文件从popup.ts上传可成功,尝试过base64、ArrayBuffer、UInt8Array三种格式均无效

报错信息

Error uploading file: FirebaseError: Firebase Storage: An unknown error occurred, please check the error payload for server response. (storage/unknown)
(anonymous) @ message-handler.ts:223
Promise.then
then @ index.cjs.js:2645
catch @ index.cjs.js:2651
background.js:1 Uncaught (in promise) FirebaseError: Firebase Storage: An unknown error occurred, please check the error payload for server response. (storage/unknown)

代码对比:popup.ts可正常运行,background.ts无效

以下代码在popup.ts中能成功上传:

const uploadTask = FirebaseStorageManager.getInstance().uploadFile(
  arrayBuffer,
  `files/${"test"}`,
  {
    contentType: file.type,
  },
)

最初的消息传递方式

popup.ts发送ArrayBuffer:

chrome.runtime.sendMessage({
  type: "UPLOAD_MEDIA_FILE",
  payload: {
    fileName: file.name,
    arrayBuffer: arrayBuffer,
    contentType: file.type,
  },
})

background.ts接收:

case "UPLOAD_MEDIA_FILE":
  const receivedBuffer: ArrayBuffer = message.payload.arrayBuffer;

更新尝试:改用navigator.serviceWorker仍报错

const reader = new FileReader()
reader.onload = () => {
  // Send the file data to the Service Worker
  navigator?.serviceWorker?.controller?.postMessage({
    fileName: file.name,
    type: "FILE_DATA",
    payload: {
      fileName: file.name,
      contentType: file.type,
      fileData: reader.result,
    },
  })
}
reader.readAsArrayBuffer(file)

background.ts(Service Worker)代码

self.addEventListener("message", async (event) => {
  if (event.data && event.data.type === "FILE_DATA") {
    const { type, payload } = event.data
    const port = event.ports[0] // Get the MessagePort for responding

    if (type === "FILE_DATA") {
      try {
        const app = initializeApp(firebaseConfig)
        const storage = getStorage(app)
        const { fileName, contentType, fileData } = payload
        console.log("Received file data:", fileName, contentType, fileData)
        console.log(fileData.byteLength)

        // Create blob from ArrayBuffer
        const blob = new Blob([fileData], { type: contentType })

        // Create storage reference
        const storageRef = ref(storage, `files/${fileName}`)

        // Upload to Firebase
        const uploadTask = uploadBytesResumable(storageRef, blob, {
          contentType: contentType,
        })
        uploadTask.on(
          "state_changed",
          (snapshot) => {
            // Handle progress
            const progress =
              (snapshot.bytesTransferred / snapshot.totalBytes) * 100
            console.log("Upload is " + progress + "% done")

            port.postMessage({
              progress: progress,
            })
          },
          (error) => {
            // Handle error
            console.error("Error uploading file:", error)
            port.postMessage({
              success: false,
              error:
                error instanceof Error ? error.message : "Unknown error",
            })
          },
          async () => {
            // Handle successful upload
            console.log("File uploaded successfully")

            // Get download URL and send success response
            const downloadURL = getDownloadURL(uploadTask.snapshot.ref)
          },
        )
      } catch (error) {
        // Send error response
        port.postMessage({
          success: false,
          error: error instanceof Error ? error.message : "Unknown error",
        })
      }
    }
  }
})

恳请协助排查问题,如需更多代码可提供。

内容的提问来源于stack exchange,提问作者Kunchok Tashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:14:56