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

Joh*_*doe 4 image-uploading node.js google-cloud-storage google-cloud-platform multer

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

我已经尝试过两种方法。第一个是用 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)
    }
  })

})
Run Code Online (Sandbox Code Playgroud)

然后,我直接尝试了GCS

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



})
Run Code Online (Sandbox Code Playgroud)

对于这两种解决方案,req.files总是undefinedreq.body是这样的缓冲区:

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

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

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

有什么建议吗?

Ane*_*eed 5

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

在你的 .env 文件中

GCS_BUCKET = <bucket name>
GCLOUD_PROJECT = <project id>
GCS_KEYFILE = <key file location>
Run Code Online (Sandbox Code Playgroud)

您可以从 GCP Console>您的项目>I AM & Admin>服务帐户下载密钥文件

在你的路线中

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();
Run Code Online (Sandbox Code Playgroud)

}

这会将文件存储到 GCS,名称为 [random-string- generated-by-gcs]_[带扩展名的文件名]。同样可以通过 req.file.filename 路由下访问。

文档