【发布时间】:2021-12-30 19:17:02
【问题描述】:
我正在管理一个内置于 MERN 堆栈中的门户,用户可以在其中独立上传创建的新音频/视频内容。 我决定使用 Google Cloud Storage 作为服务来存储用户内容。 (我知道您也可以使用 Firebase,目前我更喜欢使用“仅”云存储)。
在后端,通过 express,我创建了一个 POST / usercontent 端点,并通过 multer 接收文件,然后将其保存在 Google Cloud 上。
一切正常,但我不明白我是否正常工作:我希望将文件直接保存在 GCloud 上,而不是在后端保存,甚至暂时不保存。这是因为内容可能很大,我可能有记忆问题。
我知道我需要使用流、管道和 PassThrough,但是我目前对该主题的了解有限。我已经仔细阅读了这些答案和示例,但我只是不知道如何在合并 multer 的同时正常工作。
来源:
https://github.com/googleapis/nodejs-storage/blob/main/samples/streamFileUpload.js Unable to Pipe File Read Stream from Google Cloud Storage to Google Drive API https://cloud.google.com/storage/docs/streaming#code-samples How to upload an in memory file data to google cloud storage using nodejs?
我的代码:
import Multer from 'multer';
import { Storage } from '@google-cloud/storage';
// config multer
const multerStorage = Multer({
storage: Multer.memoryStorage(),
limits: { fileSize: 10*1024*1024 }
});
// set endpoint
router.post('/upload', multerStorage.single('uploadedFile'), async (req, res, next) => {
// creates a client from a Google service account key
const storage = new Storage({
projectId: 'xxx',
keyFilename: 'yyy'
});
// access bucket
const bucket = storage.bucket('bucketName');
// create new file inside bucket
const newFile = bucket.file(req.file.originalname);
// STREAM ***HERE MY DOUBTS! ***
const fileStream = newFile.createWriteStream({
metadata: {
contentType: req.file..mimetype
},
resumable: false
});
fileStream.write(req.file.buffer);
fileStream.on('error', err => {
console.error('error', err)
});
fileStream.on('finish', () => {
console.log('finish!');
});
fileStream.end();
// 7 response
res.status(200).json({
status: res.statusCode,
message: 'Upload OK'
});
});
谁能帮我实现这个代码直接将流发送到谷歌云存储?
【问题讨论】:
-
它应该可以工作。 我希望将文件直接保存在 GCloud 上,而不是在后端保存,甚至临时保存。- 流传输的全部目的是将数据流式传输到并从您的云存储帐户中获取,而无需先将数据保存到this document 中提到的文件中。
-
你试过代码了吗?你有什么错误吗?
-
@Prabir 我的代码运行良好,正如我在问题中指出的那样。问题是,我不知道如何测试和验证文件是否直接传输而不首先被完整读取:我已经读过几次 multer 读取并加载整个文件,然后将其传输到流中,但我只是不知道如何验证此操作。有什么想法吗?
-
我已经发布了答案。看看有没有用?
标签: javascript node.js google-cloud-storage multer