尽管没有引发错误,但图像似乎没有上传到 Firebase 存储

Posted

技术标签:

【中文标题】尽管没有引发错误,但图像似乎没有上传到 Firebase 存储【英文标题】:Image does not seem to be uploaded to Firebase storage although no error is thrown 【发布时间】:2022-01-09 22:23:43 【问题描述】:

我正在构建一个社交媒体应用程序。在应用程序中,我有一个表单,允许用户将图像上传到 Firebase 存储。

图像出现在 firebase 存储的文件夹中(即附在下面),但不知何故,当我单击图像时,它会将我重定向到空白页面并出现一个弹出窗口

保存图像后,我尝试在计算机上打开它,但它显示“我们似乎不支持此文件格式。” 同样,当我尝试使用 Img 标签在我的 react 应用程序中包含指向我的 img 的 firebase 链接时,它不会出现在应用程序中,而是显示为图标。

这是我的代码 sn-p,用于使用反应挂钩将图像设置为状态:

const handleFileChange = (e) => 
    setImage(null);
    let selected = e.target.files[0];
    console.log(selected);

    if (!selected) 
      setImgError("Please select a file.");
      return;
    

    if (!selected.type.includes("image")) 
      setImgError("Selected file must be an image.");
      return;
    
    if (!selected.size > 100000) 
      setImgError("Image file size must be less than 100kb.");
      return;
    

    setImgError(null);
    setImage(selected);
  ;

这是我的代码 sn-p,用于将图像上传到 firebase 存储(我使用的是 firebase v9):

const handleSubmit = async (e) => 
    e.preventDefault();
    let time = new Date().valueOf();
    const file = `images/$user.uid/$time/$image.name`;
    const storageRef = ref(storage, file);
    await uploadBytes(storageRef, file).then((snapshot) => 
      getDownloadURL(snapshot.ref).then((url) =>
        addDoc(collection(db, "posts"), 
          uid: user.uid,
          caption: caption,
          post: post,
          displayName: user.displayName,
          imgURL: url,
          comments: [],
          likes: [],
        )
      );
    );
    setCaption("");
    setPost("");
    history.push("/home");
  ;

编辑:我尝试按照文档上传文件 here 并进行如下更改:

const handleSubmit = async (e) => 
    e.preventDefault();
    let time = new Date().valueOf();
    const storage = getStorage();
    const file = `$image.name`;
    const storageRef = ref(storage, `images/$user.uid/$time/$image.name`);

    uploadBytes(storageRef, file).then((snapshot) => 
      console.log("Uploaded a blob or file!");
    );

我不太确定storageRef 中的第二个参数(及其格式)是什么;我假设它是我想要存储文件的位置。 对此有任何帮助/见解将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

你的 file 变量在这个 sn-p 中是错误的:

const file = `images/$user.uid/$time/$image.name`;
const storageRef = ref(storage, file);
await uploadBytes(storageRef, file).then((snapshot) => 

uploadBytes 的第二个参数期望:

斑点 | Uint8Array | ArrayBuffer 要上传的数据。

但是您传递给它的是一个字符串,其中包含您希望文件在服务器上具有的路径,这不是预期的类型之一。

正如uploading files 文档中的示例所说:

import  getStorage, ref, uploadBytes  from "firebase/storage";

const storage = getStorage();
const storageRef = ref(storage, 'some-child');

// 'file' comes from the Blob or File API
uploadBytes(storageRef, file).then((snapshot) => 
  console.log('Uploaded a blob or file!');
);

所以我希望你会想要传递e.target.files[0] 或类似的东西。

【讨论】:

嗨弗兰克,非常感谢您的回复。我刚刚尝试了上述方法,但似乎我仍然面临同样的问题 - 尽管它们出现在那里,但我无法打开 firebase 存储中的文件。我猜我仍然在传递一些不正确的东西作为storageRef 中的参数。我可以澄清一下“一些孩子”的论点应该是什么吗?我已经编辑了帖子,我使用的代码 sn-p 在“编辑”部分下。谢谢。 编辑中的代码仍然做同样类型的事情,const file = `$image.name` 。您传入的file uploadBytes(storageRef, file) 需要是对用户在浏览器中选择的文件的引用,而不是您构造的字符串。 非常感谢弗兰克!在进行了您建议的更改并更改了我的 Firebase 设置后,我设法使其工作:) 很高兴听到@Kalamazoo。不要忘记点击我的答案左侧的赞成/接受按钮。

以上是关于尽管没有引发错误,但图像似乎没有上传到 Firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章

使用云套件将图像上传到 icloud 会引发错误 ios

我已经使用 AssetImage 将图像上传到 main.dart,虽然我没有收到错误,但图像没有出现。有人请帮助我

上传到 Azure 存储时出现内部 500 错误

Django rest 框架 - 将图像上传到 Azure 存储

尽管控制台显示没有错误,但应用程序错误?

尽管有“ESCAPE ACCEPTINVCHARS”,但在 S3 中为 CSV 上传错误