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

本地PDF上传Firebase Storage为空问题排查及代码咨询

问题根源

你上传的文件只有9B是因为直接把文件路径字符串传给了uploadBytesResumable,Firebase会把这个字符串当成文件内容上传,自然得到的是一个内容为路径文本的无效PDF,大小就是路径字符串的长度。

uploadBytesResumable的第二个参数需要的是**Blob、Uint8Array、ArrayBuffer(Node.js下可用Buffer)**类型的文件内容,不是本地路径字符串。

解决方案

如果你的环境是Node.js/Electron(能直接访问本地文件系统),可以通过文件系统模块读取文件内容后再上传,修改后的代码如下:

const fs = require('fs').promises; // 导入文件系统模块

async function savePdfToFS() {
  const storage = getStorage();
  const metadata = {
    contentType: 'application/pdf' 
  };

  // 构建完整文件路径
  const filePath = "C:/Users/greta/Downloads/" + UnivFields.holdCoupImage;
  // 读取文件为Buffer(Node.js下Buffer兼容Uint8Array)
  const fileContent = await fs.readFile(filePath);

  const storageRef = ref(storage, 'images/' + UnivFields.holdCoupImage);
  // 传入读取到的文件内容,而非路径字符串
  const uploadTask = uploadBytesResumable(storageRef, fileContent, metadata);

  // 后续的上传状态监听逻辑保持不变
  await uploadTask.on('state_changed',
    (snapshot) => {
      const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
      console.log('Upload is ' + progress + '% done');
      switch (snapshot.state) {
        case 'paused':
          console.log('Upload is paused');
          break;
        case 'running':
          console.log('Upload is running');
          break;
      }
    }, 
    (error) => {
      switch (error.code) {
        case 'storage/unauthorized':
          break;
        case 'storage/canceled':
          break;
        case 'storage/unknown':
          break;
      }
    }, 
    () => {
      getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => {
        console.log('File available at', downloadURL);
      });
    }
  );
}
补充说明

如果是浏览器环境,无法直接通过本地绝对路径读取文件,需要通过用户交互(如<input type="file">)获取File对象,再将该对象传给uploadBytesResumable即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:30