如何在express(nodejs)中处理blob

Posted

技术标签:

【中文标题】如何在express(nodejs)中处理blob【英文标题】:How to handle blob in express(nodejs) 【发布时间】:2021-11-26 02:11:51 【问题描述】:

我有谷歌扩展、反应前端应用和快速服务器。 我使用 mediaRecorder 录制屏幕并将其插入前端页面。没有问题,视频在前端工作正常

const blob = new Blob(chunks,  type: "video/mp4;" );
const savedVideo = document.getElementById("savedVideo");
chunks = [];

const videoURL = window.URL.createObjectURL(blob);
savedVideo.src = videoURL;

var tracks = stream.getTracks();
tracks[0].stop();

let response = await fetch('http://localhost:3001/upload', 
  method: 'POST',
  headers: 
    'Content-Type': 'application/octet-stream',
  ,
  body: blob
);

当我将 blob 发送到服务器时,问题就开始了。我想保存视频(仅在服务器端)我想问题是在服务器端处理 blob,也许我做错了,这里是我的服务器代码:

const express = require("express");
const cors = require('cors');
const fs = require('fs');

const app = express();
const port = 3001;

app.use(cors(
  origin: 'http://localhost:3000'
));

app.post("/upload", (req, res) => 
  console.log('req.body', req.body)
  req.on('readable', function()
    const data = req.read();
    if(data) 
      fs.createWriteStream('videeoo.mp4').write(data);
      // also i didnt sure about this method to write file
    
    console.log('data', data);
  );        
);

app.listen(port, () => 
  console.log(`Server started at http://localhost:$port`);
);

express logs

我在等待你的最佳实践)Grasias!

【问题讨论】:

【参考方案1】:

嗯...这是有问题的...req.read() 通常不处理二进制数据。这里还有一个概念问题:视频可能很大,但在您的应用程序中,您在开始编写之前等待整个文件上传。所以如果你有 10 个用户,每个用户上传 10GB 的文件,这是一个问题。所以你真的想在文件到达时存储它,这样你一次只能在内存中保留几个字节......但是如果你想限制文件的大小怎么办?大概 10GB 的文件不是你想要处理的?

所以...确实有很多极端情况和需要考虑的事情。通常,您不想手动处理这些事情。幸运的是,有像 multer 这样的库可以为您处理所有这些问题:https://expressjs.com/en/resources/middleware/multer.html 您只需定义目标目录、最大文件大小等,该库会为您处理所有事情

【讨论】:

我需要先发送到后端,然后再发送到s3。所以你说我需要将文件保存在后端文件夹中,对吗?谢谢回复) 不!你之前没有提到S3。这不是您使用 S3 的方式! AWS S3(以及与此相关的所有对象存储,无论您使用哪种云)都有一种非常具体的方式来处理文件上传。该文件根本不应该通过您的服务器。您需要的是 1. 用户向您的后端发送请求,说他想上传大小为 A 字节、名称 B 等的特定文件,2. 后端生成预签名的 S3 URL(一个特殊的 URL,如果仅适用于此特定大小的特定文件名仅在接下来的几分钟内),并且用户将文件上传到该 URL 更多信息在这里:aws.amazon.com/blogs/developer/…

以上是关于如何在express(nodejs)中处理blob的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

我想通过 NodeJS Express 应用程序将 Azure blob 存储与 Angular 应用程序连接起来

NodeJS/Express 如何同时处理多个 CPU 绑定请求

nodejs / express:如何使用数据发布到外部表单?

如何使用 express 将 blob url 图像保存在文件夹中?

如何使用 nodejs / express 上传和读取文件