如何使用 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
始终是 undefined
而req.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