Javascript 通过云函数上传文件管理SDK-断开的文件

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

我一直在尝试通过firebase云功能(onRequest方法)将文件(主要是图像)上载到firebase存储。我不得不从base64表单上传文件。使用下面的代码,我能够实现它,但是上传后文件似乎被破坏了

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')

您能试试吗,他提到这对他有用