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

Posted

技术标签:

【中文标题】如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?【英文标题】:How to upload images to GCS bucket with multer and NodeJS? 【发布时间】:2019-04-30 23:32:18 【问题描述】:

我在将本地图片上传到我的谷歌云存储时遇到问题。

我已经尝试了两种方法。第一个是用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 始终是 undefinedreq.body 是这样的缓冲区:

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

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

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

有什么建议吗?

【问题讨论】:

使用 multer 时,请确保为您要上传到的存储系统设置了存储引擎。 [谷歌云存储可以试试这个](npmjs.com/package/multer-google-storage) 【参考方案1】:

确保您已将enctype="multipart/form-data" 属性添加到您的表单。 req.files 成为 undefined 的可能原因。

【讨论】:

【参考方案2】:

如果您有其他表单值,您需要 multer、multer-google-storage 和当然 bodyParser。您需要在 multipart/form-data 中发送数据

在你的 .env 文件中

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

您可以从 GCP Console>Your Project>I AM & Admin>Service Accounts 下载密钥文件

在你的路线中

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,名称为 [random-string-generated-by-gcs]_[YOUR FILE NAME WITH EXTENTION]。同样可以通过req.file.filename在路由下访问。

Documentation

【讨论】:

嗨,它是否知道 GCS 密钥等在 dotenv 文件中?因为我有一个错误:EISDIR:对目录的非法操作 它记录在这里npmjs.com/package/multer-google-storage#default-method。您面临的错误与 Google 云存储无关。 npm ***.com/questions/34959038/… 嗨兄弟@imjoymhnt,我是给出答案并添加评论的同一个人。答案有 4 票赞成。答案有答案... :) 你能告诉我在哪里传递项目 ID、存储桶名称、密钥文件等凭据。我不想将它们存储在我的系统环境中。那么还有其他解决方案吗? bcz 你在这里没有通过任何凭证。

以上是关于如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs中使用sharp调整图像大小然后使用multer上传

使用 multer 和 nodejs 将图像上传到谷歌云存储时出错

使用 multer-s3 nodejs 将图像上传到亚马逊 s3

如何在 NodeJS 中保存和显示使用 Multer 包保存的图片?

如何使用 multer 模块将图像上传到 mongodb

NodeJs如何将Multer Buffer保存到系统上的文件中