【问题标题】:FirebaseError: Firebase Storage: String does not match format 'base64': Invalid character foundFirebaseError:Firebase 存储:字符串与格式“base64”不匹配:找到无效字符
【发布时间】:2020-11-09 07:28:12
【问题描述】:

我正在尝试将 base64 图像上传到我的前库存储。我找了很长时间,但找不到它,甚至在堆栈溢出时也找不到。当我尝试上传图像时,我收到此错误,指出字符串不是 base64 格式。我在几个将base64转换为图像的网站上粘贴了相同的字符串,它工作得很好,所以字符串没问题。我不知道我错过了什么,我不知道下一步该做什么......我将非常感谢任何形式的帮助。 这是我的代码:

const storageRef = firebase.default.storage().ref().child("users")
    storageRef.putString(base64String, 'base64', { contentType: "image/jpg" }).then(snap => {
        console.log("yay");
    }).catch(err => {
        console.log("not good");
    })

我的 base64 字符串没有以“data:image/jpg;base64”开头,它看起来像这样:“/9j/4...poi//Z”

【问题讨论】:

  • 1.我首先尝试使用“dataurl”而不是“base64”上传以“data:image/png;base64”开头的整个字符串,即 storageRef.putString(base64String, 'data_url').then(snap => { 2. 是它是 png 还是 jpg?-您是否尝试将 { contentType: "image/jpg" } 更改为 { contentType: "image/png" },或者只是省略该选项对象?即 storageRef.putString(base64String, 'base64') .then(snap => { 更多:firebase.google.com/docs/storage/web/upload-files
  • 我试过了,没有帮助。我仍然得到同样的错误。图片的类型是 jpeg 而不是 png,是我使用的
  • contentType: "image/jpg" 不被识别为 JPEG 文件的实际 mime 类型,只有 contentType: "image/jpeg"。但我不认为这是你的问题。您是从浏览器、node.js 服务器还是 React Native 应用程序运行它?
  • 我把它改成了'jpeg',同样的问题。我从 node.js 运行这个

标签: javascript firebase base64 firebase-storage


【解决方案1】:

我不确定 firebase npm 包是否打算与 Node.js 一起使用,我认为 "firebase admin" 可能比我在网上阅读的内容更好。很多人在转换到 base64 和从 base64 转换时遇到问题,他们编写了自己的“atob:”和“btoa”polyfill 函数,以便这个包可以与 Node.js 一起使用。此外,这个 firebase 包需要“XMLHttpRequest”,即特定于浏览器,但如果你愿意,你可以安装更多的 polyfills - 正如我在下面所做的那样 - 看起来很难看。从浏览器而不是 node.js 中使用“firebase”npm 包可能更容易。

我可以让它工作的唯一方法是将 base64 字符串转换为 blob,然后上传,如下所示:

const firebase = require("firebase/app");
require("firebase/storage");
global.XMLHttpRequest = require("xhr2"); //polyfill
let app = firebase.initializeApp({
  apiKey: "",
  authDomain: "",
  databaseURL: "",
  projectId: "",
  storageBucket: "",
  messagingSenderId: "",
  appId: "",
});
let base64String = `iVBORw0KGgoAAAANS......`

const storageRef = firebase.storage().ref();
const imageRef = storageRef.child("123.jpeg");

//convert base64 to buffer / blob
const blob = Buffer.from(base64String, "base64");

imageRef
  .put(blob, {
    contentType: "image/jpeg",
  })
  .then(function (snapshot) {
    //console.log(snapshot);
    console.log("Uploaded blob");
  });

上传的 blob 在 firebase 存储中正确显示为图像,URL 可能在快照的元数据中。这是我用于测试的图像: https://firebasestorage.googleapis.com/v0/b/testbase64-12cae.appspot.com/o/123.jpeg?alt=media&token=23ccfe34-907f-405b-a11a-3ae686941d3f

【讨论】:

  • 非常感谢!!!!我无法形容你是如何帮助我的!我绝望了,为此挣扎了很长时间,毫无头绪……你救了我!
猜你喜欢
  • 2017-05-09
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2015-01-11
  • 2010-11-26
  • 2012-10-09
相关资源
最近更新 更多