Javascript 通过云函数上传文件管理SDK-断开的文件
我一直在尝试通过firebase云功能(onRequest方法)将文件(主要是图像)上载到firebase存储。我不得不从base64表单上传文件。使用下面的代码,我能够实现它,但是上传后文件似乎被破坏了Javascript 通过云函数上传文件管理SDK-断开的文件,javascript,node.js,firebase,google-cloud-functions,firebase-storage,Javascript,Node.js,Firebase,Google Cloud Functions,Firebase Storage,我一直在尝试通过firebase云功能(onRequest方法)将文件(主要是图像)上载到firebase存储。我不得不从base64表单上传文件。使用下面的代码,我能够实现它,但是上传后文件似乎被破坏了 const functions = require('firebase-functions'); const admin = require('firebase-admin'); const bucket = admin.storage().bucket(); const database
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const bucket = admin.storage().bucket();
const database = admin.database();
const express = require('express');
const cors = require('cors');
const safetyLogsAPI = express();
safetyLogsAPI.use(cors({ origin: true }));
safetyLogsAPI.post('/', async (req, res) => {
try {
const {
attachments,
projectId
} = req.body;
const safetyKey = database.ref('safetyLogs')
.child(projectId)
.push().key;
if(attachments && Array.isArray(attachments)) {
if (attachments.length > 0) {
for (let index = 0; index < attachments.length; index++) {
const base64Obj = attachments[index];
const { content, fileName, contentType } = base64Obj;
const stream = require('stream');
const bufferStream = new stream.PassThrough();
bufferStream.end(Buffer.from(content, 'base64'));
const fullPath = `SafetyIncidentLog/Images/${projectId}/${safetyKey}/${fileName}`;
const file = bucket.file(fullPath);
const metadata = {
projectId,
safetyLogId: safetyKey,
createdTimestamp: Date.now(),
systemGenerated: 'false',
fileType: 'Image',
fileName,
path: fullPath
};
bufferStream.pipe(file.createWriteStream({
metadata: {
contentType,
metadata
},
public: true,
validation: "md5"
}))
.on('error', (err) => {
console.log('Error Occured');
console.log(err);
})
.on('finish', () => {
console.log('File Upload Successfull');
});
}
}
}
return res.status(200).send({
code: 200,
message: 'Success'
});
} catch (error) {
console.log(error);
return res.status(500).send({
code:500,
message: 'Internal Server Error',
error: error.message
});
}
});
module.exports = functions.https.onRequest(safetyLogsAPI);
const functions=require('firebase-functions');
const admin=require('firebase-admin');
const bucket=admin.storage().bucket();
const database=admin.database();
const express=require('express');
const cors=需要(“cors”);
const safetyLogsAPI=express();
safetyLogsAPI.use(cors({origin:true}));
safetyLogsAPI.post('/',异步(请求,请求)=>{
试一试{
常数{
附件:,
投射
}=请求主体;
const safetyKey=database.ref('safetyLogs')
.儿童(项目D)
.push()键;
if(附件和数组.isArray(附件)){
如果(附件长度>0){
for(让index=0;index{
console.log('发生错误');
控制台日志(err);
})
.on('finish',()=>{
log('File Upload Successfull');
});
}
}
}
返回资源状态(200)。发送({
代码:200,,
信息:“成功”
});
}捕获(错误){
console.log(错误);
返回资源状态(500)。发送({
代码:500,
消息:“内部服务器错误”,
错误:error.message
});
}
});
module.exports=functions.https.onRequest(safetyLogsAPI);
我用前缀部分data:image/png;base64存在并消除。在这两方面我都看到了破碎的图像。那么我哪里做错了。有更好的方法吗
提前谢谢
另外,我尝试的方法是否是推荐的方法?。对于配置文件图片上传和对话图像附件等用例,建议采用这种方式,还是建议直接从客户端上传?使用云函数HTTP触发器,请求将被终止,并在您向客户端发送响应后立即关闭该功能。任何未完成的异步工作都可能永远不会完成
我在你的代码中看到的是,你在上传完成之前发送了一个响应。我可以看到您在开始上传后立即调用res.status(200).send()
。相反,您的代码应该等到响应完成后再发送,也许可以使用on('finish')
和on('error')
您能试试吗,他提到这对他有用