使用Cloud Functions将图像上传到Google Storage

时间:2019-12-17 09:13:11

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

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

我正在从客户端发送'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 Storage上保存了一些奇怪的文件,大小为35Kb(源图像为14kb) 该文件的图像未显示,并且没有指向所创建图像的链接。 enter image description here

有什么问题吗?

2 个答案:

答案 0 :(得分:1)

我认为您正在使用的ToArrayBuffer中可能出了一些问题。

您可以尝试使用base64EncodedImageString缓冲区,看看是否适合您吗?我还看到了其他SO线程,他们也试图通过Cloud Function将图像通过管道传输到GCS,而我在代码中看到的主要区别是缓冲区。

SO Thread

希望这会有所帮助。

编辑:

如前所述,该项目仍不公开,请尝试添加createWriteStream的元数据

public = true

如果您对我的意思有任何疑问,可以参考我链接的前一个SO线程,该线程也存在于此。

让我们知道。

答案 1 :(得分:1)

按照您的逻辑,您有:

<body>
  <div class="container">
    <div class="list">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
      <div class="item">7</div>
      <div class="item">8</div>
      <div class="item">9</div>
    </div>
  </div>
</body>

我相信您的意图是将Base64字符串解码为其二进制数据表示形式。我不确定您在哪里得到该代码片段,也不确定它的实际作用是什么...但是我可以向您保证,它与base64解码无关。

Node.js具有一些功能强大的库,它们可以代表您执行Base64解码。例如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); } 类。

Buffer

会将let buff = new Buffer(data, 'base64'); 中的Base64字符串解码为字节缓冲区。

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