node.js - 上传文件到谷歌云
问题描述
我正在尝试使用节点 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')
}
}
}
解决方案
搜索了一段时间后,我只需要切换到使用 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')
}
}
})
推荐阅读
- excel - 如果行不为空,则插入时间戳
- java - SAP Cloud SDK OData V4 支持
- sql - 将分隔的单元格记录拆分为行性能
- android - 我正在尝试使 AutoCompleteTextView 看起来像一个材料 Edittext
- javascript - 如何更改el-pagination的背景颜色
- android - Android:如何在 Instrumentation 测试中运行大量测试之前确保 sharedPreference 变得清晰
- highcharts - 数据标签未显示在 3D Highcharts 条/列中
- mysql - 如何使用sql将日期时间字符串转换为日期时间格式
- ruby - 为什么在 Ruby 中允许像 1 + n *= 3 这样的语句?
- z3 - z3 的可扩展性