转载自:juejin - 马睿不想说话
概要本文主要针对在使用node作为服务端接口时,前端上传上传文件至node作为中转,再次上传至oss/cdn的场景 。以及针对在这个过程中,需要对同一个文件进行不同形式之间转换的问题 。
Blob、File、Buffer与stream在解答上述问题之前,我们要先了解一下Blob、File、Buffer与stream这四者分别是什么 。以及这四者的关系是什么样的 。
Blob
这是MDN对Blob的说明 。简而言之 , 所有的“数据”都可以用blob的格式进行存储 , 而且不一定是 JavaScript 原生格式的数据 。包括但不仅限于文本、二进制、文档流等 。而通过Blob的实例方法(Blob
对象表示一个不可变、原始数据的类文件对象 。
Blob.prototype.arrayBuffer()
、Blob.prototype.stream()
),我们还可以将blob转换为Buffer和ReadableStream 。File
File
接口基于 Blob
,继承了 blob 的功能并将其扩展以支持用户系统上的文件 。接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容,且可以用在任意的 Blob 类型的 context 中 。需要注意的一点是,File并没有任何定义方法,而是只从Blob继承了slice方法 。BufferBuffer是数据以二进制形式临时存放在内存中的物理映射 。在Nodejs中,Buffer类是用于直接处理二进制数据的全局类型 。它可以以多种方式构建 。
streamNode.js 中有四种基本的流类型:
Writable
: 可以写入数据的流(例如,fs.createWriteStream()
) 。Readable
:可以从中读取数据的流(例如,fs.createReadStream()
) 。Duplex
: 两者都是Readable
和的流Writable
(例如,net.Socket
) 。Transform
:Duplex
可以在写入和读取数据时修改或转换数据的流(例如,zlib.createDeflate()
) 。
- 获取前端上传的文件
- 处理文件后,调用内部服务上传至cdn
- 我们的node服务中获取到的前端上传的文件到底是什么格式?
- 我们进行上传oss/cdn的接口,需要我们上传的文件格式又是什么样的?
- 文件名称如何保持不变/如何进行混淆?
- 如何完成文件格式的校验或过滤?
开发中的问题由于一些内部原因,Node端的开发经历了从koa2到express的重构 。所以针对两个框架的文件处理,我也都有幸(bushi)全都经历了一次 。
node上传格式由于上传至oss的第三方接口可以在前端调用,也可以在node中进行调用,所以在Postman中可以模仿上传过程 , 由此可以看到第三方接口真正需要我们传入的其实是一个
ReadStream
格式的文件 。所以我们的目标也很简单 , 那就是无论我们获取到什么格式的文件,都转换成为ReadStream格式即可 。文章插图
koa2不同于在koa中使用koa-bodyparser模块来完成post请求的处理;在koa2中,使用
koa-body
模块不仅可以完成对于post请求的处理,同时也能够处理文件类型的上传 。在这种情况下我们只需要通过
ctx.request.files
即可访问前端上传给我们的文件实例,同时我们可以看到我们获取到的是一个WriteStream
格式的文件 。通过size、name、type等属性 , 即可获取相应的属性,用于进行文件格式的校验与判断 。当我直接使用
fs.createReadStream
方法将它转换为我们所需要的格式时,问题也随之而来:由于上传后的文件经过了koa的处理,所以我们得到的WriteStream的path发生了一些变化,他变成了内存中的一个地址导致我们转化之后的文件名称也发生了变化,变成了一个内存中的地址串 。
很显然,这是我们不想要看到的,因为这对于我们来说是不可控的 。为了解决这个问题,我尝试了两种解决方式均有效,大家可以自行选择 。
【《上传那些事儿之Nest与Koa》——文件格式怎么了!】1. 使用koa-body的配置参数,进行地址转存 。
推荐阅读
- 《穿越火线》怎么改房间名字(穿越火线怎么修改房间名最新)
- 30 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-番外篇
- 山海情的原著小说_山海情是根据什么小说改编的
- 唐人街探案3剧情详解_唐人街探案3讲了什么剧情
- python渗透测试入门——基础的网络编程工具
- 茜茜公主?弗兰茨 弗兰茨有多爱茜茜公主
- 《梦幻西游》怎么赚钱(梦幻老区赚钱攻略)
- GLA 论文解读《Label-invariant Augmentation for Semi-Supervised Graph Classification》
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置
- 手机版的《我的世界》要怎么骑马和下马(我的世界手机版怎么才能骑马)