【问题标题】:Uploading an image to Google Storage using Cloud Functions使用 Cloud Functions 将图像上传到 Google Storage
【发布时间】:2019-12-17 09:13:11
【问题描述】:

我已经阅读了与此相关的所有其他答案。但这对我不起作用,或者我只是不明白一些事情。请帮忙。

我正在从客户端发送 'image/png' base64 字符串。它是这样的:“iVBORw0KGgoAAAANSUhEUgAAAgAAAA.......”

在 Cloud Functions 上我有方法:

exports.uploadImage = functions.https.onCall((data, context) => {  
  var bytes = data.imageData;
  uploadFile(bytes);
})

function _base64ToArrayBuffer(binary_string) {
  var len = binary_string.length;
  var bytes = new Uint8Array(len);
  for (var i = 0; i < len; i++) {
      bytes[i] = binary_string.charCodeAt(i);
  }
  return new Uint8Array(bytes);
}

async function uploadFile(data) {
    const imageBuffer = _base64ToArrayBuffer(data)
    const fielName = 'img/' + UTIL.getRandomString(20) + '.png'
    const fileUpload = bucket.file(fielName)

    const uploadStream = fileUpload.createWriteStream({
      metadata: {
          contentType: 'image/png'
      }
  });

  uploadStream.on('error', (err) => {
      console.log(err);
      return;
  });

  uploadStream.on('finish', () => {
      console.log('Upload success');
      bucket.file(fielName).makePublic();
  });

  uploadStream.end(imageBuffer);
}

因此,我在 Firebase 存储中保存了一些 35Kb 的奇怪文件(源图像为 14kb) 此文件的图像未显示,并且没有指向创建的图像的链接。

有什么问题?

【问题讨论】:

    标签: node.js firebase google-cloud-functions google-cloud-storage


    【解决方案1】:

    在你的逻辑中,你有:

    function _base64ToArrayBuffer(binary_string) {
      var len = binary_string.length;
      var bytes = new Uint8Array(len);
      for (var i = 0; i < len; i++) {
          bytes[i] = binary_string.charCodeAt(i);
      }
      return new Uint8Array(bytes);
    }
    

    我相信您的意图是将 Base64 字符串解码为其二进制数据表示。我不确定你从哪里得到那个代码片段,也不知道它实际上做了什么……但我可以向你保证,它与 base64 解码无关。

    Node.js 有一些强大的库可以代表您执行 Base64 解码。例如Buffer 类。

    let buff = new Buffer(data, 'base64');
    

    将data 中的 Base64 字符串解码为字节缓冲区。

    要阅读的优秀文章是Encoding and Decoding Base64 Strings in Node.js。

    【讨论】:

    • 谢谢。您对 base64 的看法是正确的,但图像仍然不公开。
    • @YuraBuyaroff - 恐怕我没有关注。在最初的帖子中,我们讨论了图像不好,我认为我们发现问题在于它们没有正确地从 base64 解码。那么,我们现在处于拼图中的哪个位置?
    • @YuraBuyaroff 我认为您现在需要在元数据中传递公共价值。我将编辑我的答案,以便您试用并告诉我。
    【解决方案2】:

    我认为您正在使用的 ToArrayBuffer 可能有问题。

    您能否尝试使用 base64EncodedImageString 缓冲区并查看它是否适合您?我已经看到其他人试图通过云函数将图像传输到 GCS 的其他 SO 线程,我看到的与您的代码的主要区别是缓冲区。

    SO Thread

    希望这会有所帮助。

    编辑:

    正如您提到的,该项目仍然不公开,请尝试添加 createWriteStream 的元数据

    public = true
    

    如果您对我的意思有任何疑问,您可以参考我链接的上一个 SO 线程,它也在那里。

    让我们知道。

    【讨论】:

    • 谢谢。这种获取 bufferStream 的方法使文件大小为 29.69 KB,但仍然不是图片。我的 base64 字符串似乎是正确的。例如,我用base64-image.de 进行了检查。所以还是不行
    • 再次感谢。但它并不能完全满足我的需求。它不会创建访问令牌。正如您在屏幕截图中看到的那样。这意味着我没有可用于图像的公共 url。我认为应该通过使用 Storage sdk 的某些功能来完成,而不仅仅是元数据。
    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 2016-11-09
    • 2021-07-30
    • 2019-04-08
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多