【发布时间】:2021-01-20 11:32:49
【问题描述】:
我创建了一个 Chrome 扩展程序,用于截取当前选项卡的屏幕截图。然后我想将图片上传到 Firebase。
chrome.tabs.captureVisibleTab 在 dataUrl string [docs] 返回,我尝试将其作为 formData 包含到 POST 请求中,如下所示:
screenshotBtn.onclick = function(){
// generate the screenshot
chrome.tabs.captureVisibleTab(null, { format: 'png', quality: 80 }, function(dataUrl){
// console.log(dataUrl);
// create imageBlob from data
let imgBlob = b64toBlob(dataUrl.replace('data:image/png;base64,', ''), "image/png");
console.log('imgBlob: ', imgBlob);
let formData = new FormData();
formData.append('image', imgBlob);
// upload to Firebase Storage
let url = endpoint + '/uploadImage';
fetch(url, {
method: 'POST',
headers: {
'Content-Type': false
},
body: formData
})
.then((response) => response.json())
.then(data => {
console.log(data);
});
});
};
(函数b64toBlob取自这个Stackoverflow Post)
我尝试处理图像并将其上传到我服务器上的 Firebase,如下所示:
app.post("/api/uploadImage", (req, res) => {
(async () => {
try {
console.log(req.body.image);
// req.body.image = image in base64 format
await uploadFile(req.body.image);
return res.status(200).send();
} catch(error){
console.log(error);
return res.status(500).send(error);
}
})();
});
async function uploadFile(imageBlob){
const metadata = {
metadata: {
firebaseStorageDownloadTokens: uuid()
},
contentType: 'image/jpeg',
cacheControl: 'public, max-age=31536000'
};
await bucket.upload(imageBlob, {
gzip: true,
metadata: metadata,
});
}
我无法判断问题是否存在
- POST 请求的格式化方式
- 在服务器上接收文件的方式
【问题讨论】:
-
req.body可能无法处理二进制数据。因此,要么 1. 添加 Express 扩展来处理二进制数据,要么 2. 您可以发送 base64 数据并在服务器端转换回 blob,而不是发送二进制数据。
标签: javascript firebase google-chrome-extension firebase-storage