利用nodejs后端传视频文件到服务器笔记

简介

被一个文件上传给整嘛了,如果是web前端上传视频只需拼接表单格式即可实现上传。而作为node后端,通过后端在后台无感上传,这里需要涉及到的知识点就有些多了,上传方式也大不一样了。后端文件上传有个好处就是无需用户主动操作。

终端代码

首先后端没有FormData这个函数,所以无法去new FormData。这个函数就是为了拼接表单结构的。所以我们先安装类似的插件

const FormData = require('form-data');

这样我们才能new 一个表单出来

const formData = new FormData()

其次就是文件的读取,后端没有input标签让用户去选择本地文件,所以后端只能通过fs来读取电脑里的文件。但是读取过来的文件要规定好格式,比如二进制格式。binary就是二进制格式。否则文件传入服务之后视频是无法正常打开的。

const videoData = fs.readFileSync(filePath,{ encoding: 'binary' });

然后直接将二进制流存入到表单中

formData.append('file', videoData);

最后直接将整个表单传递上去

复制代码
axios.post('/upload', formData, {
  headers: {
  'Authorization': obj.token
  }
 })

当然有人要问了,为什么不能直接就post然后接对象来存储传参呢?这样不简单多了吗?如下代码

axios.post('/upload', {file:videoData}, {

headers: {

'Authorization': obj.token

}

})

这里又要注意一个问题了,就是post传参的大小限制,哪怕我服务器放开了大小限制,但是此方法直接传参就是传不上去,报参数太大的错误。所以文件只能用表单的形式传递上去。

服务端代码

服务端这块需要单独再处理一次,与传统的上传不同的是,这次是直接传递的二进制。接受方式也是大大不同。web端表单上传过来的数据通过此接收。

const file = (ctx.request.files||ctx.request.file).file

而这里的file是一个对象,可以获取到里面的type,path,name而这里的path其实是服务器的临时的一个缓存位置。最后上传结束之后我们需要把缓存里的文件复制到我们对应的目录中的,并且还要删除这个临时的缓存。如果不删除这个文件,有可能被上传病毒上来,这个我在之前的文章有讲解过linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本_宝塔 tmp-CSDN博客

而这次却不同了,这次直接二进制传递过来之后就不走缓存了。你也无需再读流写流了。

文件数据的获取直接从body参数里拿

const file = ctx.request.body.file

文件的大小判断需要用buffer里的函数

const size = Buffer.byteLength(file)

拿到这个二进制文件只需再写入到对应服务器的某个目录里就可以了

javascript 复制代码
fs.writeFile(path.join(config.static.path , filePathf), file,{ encoding: 'binary' }, (err) => {
       if (err) {
            console.error('写入文件时出错:', err);
            return;
      }
      console.log('文件写入成功');
});
相关推荐
破芽9 小时前
learn-claude-code-s05-s11-学习笔记
笔记·学习
苏三说技术9 小时前
继PHP之后,Java也爆出了重大安全漏洞!
后端
程序猿乐锅10 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
fish_zzzz10 小时前
笔记--浅谈内存,存储空间,BIOS芯片,显卡GPU、VRAM(1)
笔记·1024程序员节
ACP广源盛1392462567310 小时前
PCIe Gen3 交换芯片选型笔记:多路扩展方案 IX7024@ACP 评估
笔记·硬件架构·pcie·国产芯片
code2cat10 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节
Younglina11 小时前
三个晚上,我和 WorkBuddy 做了个生图网站
前端·后端·ai编程
深圳老胡11 小时前
STM32 开发中 Trae 内置模型怎么选:Seed、MiniMax、GLM、DeepSeek、Kimi、Qwen 全对比
笔记·stm32·单片机·嵌入式硬件·代码规范·1024程序员节
坤坤子吖11 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
金銀銅鐵12 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程