(htttp 协议版本)利用 nodejs(multer,express),Ajax 实现页面初步的上传下载
掌握
multer(官网中文 API)的使用:storage 设置存储位置,上传文件预处理利用时间戳对文件的重命名
回顾 express 创建静态资源服务器:static 的参数里写路径,目录名都行,都会对应到一个目录,在网页里这个目录名不需要带上,直接访问文件名即可;部署多个静态资源服务器,如果目录之间有同名文件,则按 static 执行顺序找,找到就停止,找不到就下一个
响应返回资源的设置:
//默认情况(响应头不调整的情况)
//相当于跳转,但实际是返回资源给浏览器显示
res.sendFile(__dirname + "/index.html");
//区分
//下载所需响应头
res.setHeader("Content-type", "application/octet-stream");
//!!!响应头里不允许带中文
res.setHeader("Content-Disposition", `attachment;filename=asd.jpg`);
res.sendFile(__dirname + "/uploads/QQ图片20200621185630.jpg");
socket.io 官网的案例 https://socket.io/get-started/chat
-
准备工作,确定能编写 websocket 的工具------socket.io
-
仿照官网的案例,我们就可以很快的搭建一个 websocket 环境
-
我们实现文件传输就得确认如何从前端拿取数据,用什么数据类型进行存储,传输,这是整个项目的核心。基于 api 提供的 emit 方法和补充内容,socket 是可以接收很多种类的参数,自然也包括文件,但限定一下几种类型 Blob,ArrayBuffer,File
-
再了解前端通过 input[type=file]的标签拿取文件数据的方式后,采用**fileReader**的方式,因为其余两种方式对 HTTP 的依赖性较强,websocket 难以处理
-
数据到 node 服务端就到了上传步骤,就需要有能处理这种 ArrayBuffer 类型的工具:fs,path(fs 负责将数据写入进文件,path 处理文件的路径问题)
-
最大问题,fs.writeFile 方法对写入数据类型会有限制:ArrayBuffer 不完全等于 Buffer
解决办法就是类型转换https://blog.csdn.net/iningwei/article/details/100143603 let buffer = Buffer.from(arraybuffer)//ArrayBuffer 转 Buffer
-
写入成功执行其回调函数时,我们就可以提供对应的下载链接给前端,借助服务端的下载接口完成下载(借助 http 协议去实现下载,因为下载是属于用户自身需求,不需要共享)
-
后续问题,对 1M 以上的文件无法上传
大的文件读取 readAsArrayBuffer 对本机的内存消耗过大,导致 websocket 重连
https://www.bilibili.com/video/BV1RK4y147uV?share_source=copy_web
部署之后分片上传失败,初步怀疑是 websocket 的原因---完成一次请求就会重启
于是直接修改配置:
-
maxHttpBufferSize: 50000000,//50M pingTimeout: 30000,//单次 socket 消息发送的最大连接时长,超过就重连