Nodejs 接受视频文件,不保存文件在服务器,上传七牛云。该怎么实现。

目前的设计是,安卓设备将视频文件分片通过接口,上传到 node 后端。现在避免的是不保存文件在服务器。 能不能实现,node 接受分片,直接上传到七牛云,最后合成 mp4 文件。 如果有更好的方法也可以改。麻烦各位了


Nodejs 接受视频文件,不保存文件在服务器,上传七牛云。该怎么实现。
34 回复

呃,直接传七牛是有什么问题么?我记得可以直接传的来着?


我以前在 web 端用过七牛的 sdk 直接把文件分片上传到七牛云,不需要经过自己的服务器

为什么不直接在端上传到七牛

我也想这样,但老板不想。希望可以文件经过服务器。因为项目型会改动成本地系统,那时候视频就保存本地系统。

那你用个开源支持 OSS 的网络文件系统去作为中间件就好了嘛,这样的话想用哪种都可以,对于你后端来说都是那个文件系统的接口,实现了存储方式的透明化

服务器是 Gbps 级别带宽,并且不限流量的?如果是这种情况可以考虑。

我们的 web 系统分为云上版本和本地部署版本,用环境变量区分,如果是云上则直传七牛,如果是 op 就存储在服务器。老板知道文件多的话服务器压力很大么 ~

不是,10m 小水管,所以我想着安卓请求上来分片的,直接上传七牛云,不留云服务器。

node 后端上传到七牛云之后把本地文件删除不就完了

相同的设计方法,通过变量控制。如果本地服务器就不太需要管。但是云服务器的,还有其他东西在跑。看能不能不存储。昨天已经去跟他说了,老板去找人问,别人回复他即使 app 设计上传东西指定一个地址,老板也不希望在 app 上直传七牛云。

10 Mbps 带宽只够一个用户以 1 MB/s 的上传视频,他上传的时候其他所有用户都歇菜。

我知道,现在希望看能不能不保存视频在本地,去上传七牛云。因为也不是一下能上传完到七牛云。

?后端签发 policy 然后前端带着 policy 去 oss 上传不是常规操作吗

如果一定要对系统改动最小,可以考虑在存储服务商上搞一个 Serverless (或者云服务器),然后在上面接收上传的文件(或分片),在云上使用存储服务商的 SDK ,走内网传输到存储服务商即可。
这个方案不太需要改动客户端,只要一般的 API 和客户端上传走不同的域名即可。

老板不希望在 app 写死一个方法是上传七牛云,而且是公司的七牛云。可能打算 app 也单独出售,给别人对接

感觉给出新方案。可能不太能实现,因为要钱

那就用 S3 协议搞一套上传啊,兼容性很强,所有云存储服务商,包括自建对象存储都支持。

感谢 感谢,我去看看怎么弄

程序里做分层不行吗?上传方法做个接口,用哪个上传就实现哪个呗。

服务端返回上传 token ,客户端分片后直接上传到七牛云,一般是这么操作的。



我也是这么建议,老板不采用没办法。现在怕的是上传到云服务器,顶不住。本地方式的话,应该随便搞没什么太大问题。

#21 那也应该在获取 Token 时获取上传域名和路径,后续服务端改就行了啊,上传逻辑不变的。

这种情况正常不是有个接口请求上传 token ,上传地址。
客户端判断,如果是云上版本,就用直接传七牛,是本地版本,就直接传上传地址。

本地服务器也部署一个对象存储的服务,比如 MINIO ,然后由签发上传地址的那个接口来做区分就好,设备保留原有的分片上传逻辑,接口签发 PUT 的地址是七牛就分配上传到七牛,签发的是 MINIO 就传到 minio 。

可以试试 Cloudreve ,上传文件不保存到服务器

七牛也支持分片啊,你收到一个分片就往七牛传一个
https://developer.qiniu.com/kodo/6366/upload-part

买台七牛云主机当上传服务器,然后内网互通,还可以用 S3FS 把对象存储挂载到主机。

讲道理,哪怕算一下实际场景下这 10Mbps 小水管是什么个体验,一般生成的视频是多大,多久会产生一个需要上传的视频,一个视频需要上传多久,思路正常就不会考虑这样搞。
没问题你就写个反代慢慢传呗。不想哪怕落一次盘那就用内存存着呗。

不想在 App 写死,感觉最好还是,提供一个接口,返回 token 和上传地址,上传地址后端配置现在返回七牛云的,后续要换再换(别的七牛云或者本地上传地址),非要经过自己的服务器中转的确不是一个好法子。

你就正常存到服务器,七牛设置一个回源策略就行了。

回复都快 30 层了,没有一个人生产用过 sts token 吗,用户向后端申请上传 token ,你后端返回七牛云的 sts token ,安卓端直接上传七牛云,这是很标准的方案了🧐

#31 我就是这么干的。阿里云,官网都有实例,无脑复制就能搞定

要在Node.js中接受视频文件上传,但不直接保存在服务器上,而是直接上传到七牛云(QiNiu Cloud),你可以使用multer中间件处理文件上传流,并结合七牛云的SDK进行上传操作。以下是一个简单的实现示例:

  1. 安装必要的包:
npm install multer qiniu
  1. 编写代码:
const express = require('express');
const multer = require('multer')({ dest: 'uploads/' }); // 仅用于获取流,实际不保存
const qiniu = require("qiniu");
const fs = require('fs');

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

// 七牛云配置
const accessKey = 'your-access-key';
const secretKey = 'your-secret-key';
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const options = {
  scope: 'your-bucket-name',
};
const putPolicy = new qiniu.rs.PutPolicy(options);
const uploadToken = putPolicy.uploadToken(mac);

app.post('/upload', multer.single('video'), (req, res) => {
  const formUploader = new qiniu.form_up.FormUploader();
  const putExtra = new qiniu.form_up.PutExtra();
  
  const key = 'unique-filename.mp4'; // 在七牛云上的文件名
  formUploader.putFile(uploadToken, key, req.file.path, putExtra, function(respBody, respErr) {
    if (respErr) {
      throw respErr;
    }
    // 删除临时文件
    fs.unlinkSync(req.file.path);
    res.send('File uploaded to QiNiu successfully');
  });
});

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

注意:实际使用时请替换your-access-keyyour-secret-keyyour-bucket-name为你在七牛云上的配置信息。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!