一个使用stream的方式上传文件到aliyun oss的Nodejs模块~~
发布于 8 年前 作者 berwin 13750 次浏览 来自 分享

aliyun-oss-upload-stream

用Aliyun oss 的 Multipart upload API 实现的Node.js模块,通过stream的方式上传文件。

为什么使用stream?

  • 使用stream的方式上传文件可以很大程度上降低服务器内存开销。Aliyun官方SDK并没有对stream进行一个完美的封装,所以通常上传文件(Put Object)的流程是客户端上传文件到服务器,服务器把文件数据缓存到内存,等文件全部上传完毕后,一次性上传到Aliyun Oss服务。这样做一旦瞬间上传文件的请求过多,服务器的内存开销会直线上升。而使用stream的方式上传文件的流程是客户端在上传文件数据到服务器的过程中,服务器同时也在把文件数据往Aliyun Oss服务传送,而不需要在服务器上缓存文件数据。
  • 可以上传大文件,根据上传数据方式不同而不同, Put Object 方式 文件最大不能超过 5GB,而使用stream的方式,文件大小不能超过 48.8TB
  • 更快的速度,由于传统方式(Put Object方式)是客户端上传完毕文件后,统一上传到Aliyun Oss,而stream的方式基本上客户端上传完毕后,服务器已经把一大半的文件数据上传到Aliyun了,所以速度要快很多
  • 使用更简单,经过封装后,stream的方式使用起来非常的方便,1分钟就可以学会如何使用

开源地址:https://github.com/berwin/aliyun-oss-upload-stream

刚发布一个1.0.0的版本,欢迎大家提出宝贵的意见,如果大家发现bug或者有什么建议可以提issue,如果靠谱,我会及时更新和发布新版本的~~ 也欢迎大家帮忙一起开发,提交pull request~~

8 回复

可以使用ali-oss哦,支持stream,同时还支持浏览器中使用。

怎么在express里直接把上传上来的文件按照 你这种方式直接上传而不在自己的服务器保存临时文件

@lanyanai 因为使用stream的方式就不需要再服务器保持临时文件。 之前的流程是 client -> server -> server把文件存到server的某个目录为临时文件 -> 服务器读取文件 -> 上传到阿里云 使用stream的流程是 client -> server -> 阿里云 这样能保证上传速度,还能保证不会因为上传文件过大而吃内存。

@rockuw 看了一下,很不错,功能也很强大。但是如果只是想使用stream 这一个功能的话,我还是倾向于 aliyun-oss-upload-stream

看了一下你的操作文档: upload.minPartSize(1048576); // 1M,表示每块part大小至少大于1M var read = fs.createReadStream(’./photo.jpg’); 你这个"./photo.jpg"是在客户端的文件?还是服务器上的文件?如果是客户端(比如pc浏览器)的文件,那这个就不涉及到server了啊,如果是服务器端,那你这个文件,看名字的话,没有绕过“在服务器上保存文件”这个步骤啊

@18Yi 噢噢噢,这是一个演示案例,用 fs.createReadStream 模拟了一个 可读流~

楼主:我现在碰到了一个问题,就是我获取到了微信服务器上的图片流,然后怎么样直接传到阿里云服务器呢,求指教!

回到顶部