【问题标题】:Upload (direct stream) a file from frontend to Google Cloud Storage using multer使用 multer 将文件从前端上传(直接流式传输)到 Google Cloud Storage
【发布时间】: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


【解决方案1】:

流传输的目的是将数据流式传输到您的 Cloud Storage 帐户或从您的云存储帐户传输数据,而无需先将数据保存到 this document 中提到的文件中。

您关心的方法 createWriteStream 记录在 here。您可以使用here 可用的选项来控制流。

对于可恢复上传,如果目录是可写的,则文件可以存储在本地,如this document 中所述。

可恢复上传会自动启用,并且必须通过将 options.resumable 设置为 false 来明确关闭。

可恢复上传需要对 $HOME 目录的写入权限。通过config-store,存储了一些元数据。默认情况下,如果目录不可写,我们将退回到简单的上传。但是,如果您明确请求可恢复上传,而我们无法写入配置目录,我们将返回 ResumableUploadError。

在你的情况下,正如你所说的 options.resumable 为 false,它应该是一个简单的上传,不应该在本地存储文件。

要检查它是否存储在本地存储中,您可以在阻止二进制写入磁盘的范围内运行代码。或者,您可以在上传操作期间监控磁盘使用情况。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多