如何使用multer和NodeJS将图片上传到GCS存储桶?

4

我遇到了上传本地图片至谷歌云存储的问题。

我已经尝试了两种方法。第一种是使用multer上传。

var storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, './uploads/')
    },
    filename: (req, file, cb) => {
      cb(null, file.fieldname + '-' + Date.now())
    }
});
var upload = multer({storage: storage}).single('image'); 

app.post('/upload',function(req,res,next){
  upload(req,res,(err) => {
    if(err){
      console.log(err)
    }else{
      console.log(req.file)
    }
  })

})

然后,我尝试直接使用GCS

var bucket = admin.storage().bucket('mybucket')
app.post('/upload',function(req,res,next){
 bucket
.save(file)
.then(() => {



})

对于这两种解决方案,req.files 总是未定义的,而 req.body 是一个像这样的缓冲区:

<Buffer 2d 2d 2d 2d ...>

当我尝试将此缓冲区保存在我的 GCS 存储桶上时,.jpg/png 文件被创建在我的存储桶中,但是它是损坏的。

我正在浏览网页寻找解决方案,但我没有找到任何可以帮助我克服这种情况的方法。

有什么建议吗?


使用multer时,请确保存储引擎已设置为您要上传到的存储系统。您可以尝试使用此链接来上传至Google Cloud Storage - mgoya
2个回答

5

如果您有额外的表单值,您需要使用multer、multer-google-storage和bodyParser。您需要以multipart/form-data格式发送数据。

在您的.env文件中:

GCS_BUCKET = <bucket name>
GCLOUD_PROJECT = <project id>
GCS_KEYFILE = <key file location>

您可以从GCP控制台>您的项目>IAM和管理>服务帐户中下载密钥文件。
在您的路由中。
const multer = require('multer');
const multerGoogleStorage = require("multer-google-storage");

var uploadHandler = multer({
  storage: multerGoogleStorage.storageEngine()
});

router.post('/', uploadHandler.single('image'), function (req, res, next) {
  const body = req.body;
  res.json({fileName: req.file.filename});
  res.end();

这将使用名称为 [由 GCS 生成的随机字符串]_[您的文件名及其扩展名] 的方式将文件存储到 GCS 中。可以通过 req.file.filename 在路由下访问相同的内容。

文档


你好,它是否知道GCS密钥等在dotenv文件中?因为我遇到了一个错误:EISDIR:对目录的非法操作。 - Yoël Zerbib
这里有文档 https://www.npmjs.com/package/multer-google-storage#default-method。你遇到的错误与Google云存储无关,可能是npm的其他问题 https://dev59.com/21sW5IYBdhLWcg3wdW-T - Anees Hameed
嗨兄弟@imjoymhnt,我是给出答案并添加评论的同一人。答案有4个赞。答案就是答案... :) - Anees Hameed
请问您在哪里可以传递凭据,例如项目 ID、存储桶名称、密钥文件等。我不想将它们存储在我的系统环境中。那么是否有其他解决方案?因为您没有在此处传递任何凭据。 - imjoymhnt

0
请确保在您的表单中添加了enctype="multipart/form-data"属性。 req.filesundefined的可能原因是文件上传时未正确设置表单属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接