【问题标题】:uploading file to google cloud上传文件到谷歌云
【发布时间】:2020-12-22 09:48:42
【问题描述】:

我正在尝试使用节点 js 和快速文件上传将文件上传到谷歌云存储桶。到目前为止,当我上传文件时,文件本身会上传到存储桶,但文件大小没有,这导致图像无法正常工作。

// uploading single image
const fileData = req.files.files
const creteFeed = await new Feed({
    feedby: req.user,
    feedTxt: txt,
    deleted: 0,
    feedReaction: 0,
    feedComment: 0,
    feedShare: 0,
    feedType: Feedtype,
})
const newFeed = await creteFeed.save()
if (newFeed) {
    const FeedMed = await new FeedMedia({
        feedby: req.user,
        feed_id: newFeed._id,
        feedMedia_type:fileData.mimetype,
        feedMedia_name: fileData.name,
        category:'feed',
        url: `https://storage.googleapis.com/${bucket.name}/${fileData.name}`,
        deleted: 0
    })
    const newFeedMed = await FeedMed.save()
    if(newFeedMed){

        //  Create a new blob in the bucket and upload the file data.

        const blob = bucket.file(fileData.name);
        const blobStream = blob.createWriteStream();
        blobStream.on('finish', res => {

        });

        blobStream.on('finish', () => {
            // The public URL can be used to directly access the file via HTTP.
            const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`

            res.status(200).send(publicUrl);
        });

        blobStream.end(fileData.buffer);
            // res.json('success')
        }
    }
}

【问题讨论】:

  • 你在 blobStream 中写了什么?
  • 第一个 blobstream 是一个错误,第二个是获取已上传文件的 URL,但该文件正在 googl 存储桶上工作,因为没有文件大小
  • 这对您有帮助吗:stackoverflow.com/questions/62666032/…?
  • 尝试在创建流中添加一些选项,例如:blob.createWriteStream({ metadata: { contentType: file.mimetype } }) 并删除空的.on('finish'),如果这有帮助,请告诉我。
  • 谢谢大家,我只是切换到 multer 而不是 express-fileupload,它似乎工作正常

标签: node.js google-cloud-storage multer


【解决方案1】:

搜索了一段时间后,我不得不切换到使用 multer

const gc = new Storage({
    keyFilename: Path.join(__dirname,process.env.gcBucket.jsonpath),
    projectId:process.env.gcBucketID
})

const bucket = gc.bucket(process.env.gcBucketname)
// Multer is required to process file uploads and make them available via
// req.files.
const multer = Multer({
    storage: Multer.memoryStorage(),
    limits: {
      fileSize: 5 * 1024 * 1024, // no larger than 5mb, you can change as needed.
    },
  });
  
Router.post('/pageFeed',multer.array('files'),authoriazation,async(req,res)=>{

  
    const { txt,Feedtype,feedby } = req.body


        // uploading multiple image
        if(req.files.length > 0){

            const creteFeed = await new Feed({
                feedby: feedby,
                feedTxt: txt,
                deleted: 0,
                feedReaction: 0,
                feedComment: 0,
                feedShare: 0,
                feedType: Feedtype,
            })
            const newFeed = await creteFeed.save()
            if(newFeed){
                for (newfile of req.files) {
                    const FeedMed = await new FeedMedia({
                        feed_id: newFeed._id,
                        feedby: feedby,
                        feedMedia_type:newfile.mimetype,
                        feedMedia_name:newfile.originalname,
                        category:'feed',
                        url: `https://storage.googleapis.com/${bucket.name}/${newfile.originalname}`,
                        deleted:0
                    })
                    const newFeedMed = await FeedMed.save()
                    if(newFeedMed){
                        const blob = bucket.file(newfile.originalname);
                            const blobStream = blob.createWriteStream();
                           
                            blobStream.on('finish', () => {
                                // The public URL can be used to directly access the file via HTTP.
                                res.json({msg:'success'})
                            });
                        
                            blobStream.end(newfile.buffer);
                    }else{
                        res.json({error:'error uploading'})
                    }
                }
            }
        }else{
        const creteFeed = await new Feed({
            feedby: feedby,
            feedTxt: txt,
            deleted: 0,
            feedReaction: 0,
            feedComment: 0,
            feedShare: 0,
            feedType: Feedtype,
        })
        const newFeed = await creteFeed.save()
        if(newFeed){
            res.json('success')
        }
        
    }

})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多