我已经阅读了与此相关的所有其他答案。但这对我不起作用,或者我只是听不懂。请帮忙。
我正在从客户端发送'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)
该文件的图像未显示,并且没有指向所创建图像的链接。
有什么问题吗?
答案 0 :(得分:1)
我认为您正在使用的ToArrayBuffer中可能出了一些问题。
您可以尝试使用base64EncodedImageString缓冲区,看看是否适合您吗?我还看到了其他SO线程,他们也试图通过Cloud Function将图像通过管道传输到GCS,而我在代码中看到的主要区别是缓冲区。
希望这会有所帮助。
编辑:
如前所述,该项目仍不公开,请尝试添加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字符串解码为字节缓冲区。