本地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
相关产品推荐
相关产品推荐

