Nodejs 接受视频文件,不保存文件在服务器,上传七牛云。该怎么实现。
目前的设计是,安卓设备将视频文件分片通过接口,上传到 node 后端。现在避免的是不保存文件在服务器。 能不能实现,node 接受分片,直接上传到七牛云,最后合成 mp4 文件。 如果有更好的方法也可以改。麻烦各位了
Nodejs 接受视频文件,不保存文件在服务器,上传七牛云。该怎么实现。
呃,直接传七牛是有什么问题么?我记得可以直接传的来着?
我以前在 web 端用过七牛的 sdk 直接把文件分片上传到七牛云,不需要经过自己的服务器
我也想这样,但老板不想。希望可以文件经过服务器。因为项目型会改动成本地系统,那时候视频就保存本地系统。
那你用个开源支持 OSS 的网络文件系统去作为中间件就好了嘛,这样的话想用哪种都可以,对于你后端来说都是那个文件系统的接口,实现了存储方式的透明化
服务器是 Gbps 级别带宽,并且不限流量的?如果是这种情况可以考虑。
我们的 web 系统分为云上版本和本地部署版本,用环境变量区分,如果是云上则直传七牛,如果是 op 就存储在服务器。老板知道文件多的话服务器压力很大么 ~
不是,10m 小水管,所以我想着安卓请求上来分片的,直接上传七牛云,不留云服务器。
node 后端上传到七牛云之后把本地文件删除不就完了
相同的设计方法,通过变量控制。如果本地服务器就不太需要管。但是云服务器的,还有其他东西在跑。看能不能不存储。昨天已经去跟他说了,老板去找人问,别人回复他即使 app 设计上传东西指定一个地址,老板也不希望在 app 上直传七牛云。
我知道,现在希望看能不能不保存视频在本地,去上传七牛云。因为也不是一下能上传完到七牛云。
?后端签发 policy 然后前端带着 policy 去 oss 上传不是常规操作吗
如果一定要对系统改动最小,可以考虑在存储服务商上搞一个 Serverless (或者云服务器),然后在上面接收上传的文件(或分片),在云上使用存储服务商的 SDK ,走内网传输到存储服务商即可。
这个方案不太需要改动客户端,只要一般的 API 和客户端上传走不同的域名即可。
老板不希望在 app 写死一个方法是上传七牛云,而且是公司的七牛云。可能打算 app 也单独出售,给别人对接
感觉给出新方案。可能不太能实现,因为要钱
感谢 感谢,我去看看怎么弄
程序里做分层不行吗?上传方法做个接口,用哪个上传就实现哪个呗。
服务端返回上传 token ,客户端分片后直接上传到七牛云,一般是这么操作的。
我也是这么建议,老板不采用没办法。现在怕的是上传到云服务器,顶不住。本地方式的话,应该随便搞没什么太大问题。
这种情况正常不是有个接口请求上传 token ,上传地址。
客户端判断,如果是云上版本,就用直接传七牛,是本地版本,就直接传上传地址。
本地服务器也部署一个对象存储的服务,比如 MINIO ,然后由签发上传地址的那个接口来做区分就好,设备保留原有的分片上传逻辑,接口签发 PUT 的地址是七牛就分配上传到七牛,签发的是 MINIO 就传到 minio 。
可以试试 Cloudreve ,上传文件不保存到服务器
七牛也支持分片啊,你收到一个分片就往七牛传一个
https://developer.qiniu.com/kodo/6366/upload-part
买台七牛云主机当上传服务器,然后内网互通,还可以用 S3FS 把对象存储挂载到主机。
不想在 App 写死,感觉最好还是,提供一个接口,返回 token 和上传地址,上传地址后端配置现在返回七牛云的,后续要换再换(别的七牛云或者本地上传地址),非要经过自己的服务器中转的确不是一个好法子。
你就正常存到服务器,七牛设置一个回源策略就行了。
回复都快 30 层了,没有一个人生产用过 sts token 吗,用户向后端申请上传 token ,你后端返回七牛云的 sts token ,安卓端直接上传七牛云,这是很标准的方案了🧐
#31 我就是这么干的。阿里云,官网都有实例,无脑复制就能搞定
找到你了。
要在Node.js中接受视频文件上传,但不直接保存在服务器上,而是直接上传到七牛云(QiNiu Cloud),你可以使用multer
中间件处理文件上传流,并结合七牛云的SDK进行上传操作。以下是一个简单的实现示例:
- 安装必要的包:
npm install multer qiniu
- 编写代码:
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-key
、your-secret-key
和your-bucket-name
为你在七牛云上的配置信息。