nodejs 文件到s3的几种方法

s3 是一个很不错的文件存储以及管理系统,很多时候我们简化文件处理(比如大文件或者,需要同步处理的)

参考使用

  • 参考图
    从工具以及代码层面

 

 

  • 简单说明
    工具上,我们可以直接将s3 暴露为一个普通的文件系统(一般都fuse)然后就可以按照标准的文件操作了,可以简单对于s3连接的处理,但是也是有缺点的就是依赖
    底层实现的稳定性
    代码上,可以通过先读取,然后调用s3 api 通过put 写入(先读取完成然后写入)stream pipe 模式(将s3 写入使用writable stream)这样比较高效,还有就是使用union fs 模式,就是将s3 操作包装为一个标准的nodejs fs 接口,通过nodejs 10 之后的pipeline 操作是一个推荐的玩法(主要是安全)
    基于pipe 参考实现
 
const fs = require("fs")
const minio = require("minio")
const stream = require('stream');
let readFs= fs.createReadStream("./app.js")
const  minoClient = new minio.Client(
    {
        endPoint:"127.0.0.1",
        port:9002,
        useSSL:false,
        pathStyle:true,
        accessKey:"minio",
        secretKey:"minio123"
    }
)
// PassThrough 实际上是一个测试常见的stream,但是很好用
var pass = new stream.PassThrough();
minoClient.putObject("cats","appdalong.js",pass)
readFs.pipe(pass)

pipeline 模式

const fs = require("fs")
const minio = require("minio")
const {pipeline,PassThrough} = require('stream');
let readFs = fs.createReadStream("./app.js")
const minoClient = new minio.Client(
    {
        endPoint: "127.0.0.1",
        port: 9002,
        useSSL: false,
        pathStyle: true,
        accessKey: "minio",
        secretKey: "minio123"
    }
)
var pass = new PassThrough();
minoClient.putObject("cats", "appdalong.js", pass)
pipeline(readFs,pass,(err)=>{
    console.log(err,"from pipeline")
})

union fs 模式可以直接使用@hasnat/s3fs (项目比较老了,对于minio 支持不确定,后边测试下)

说明

nodejs 的stream 操作是比较有意思的,而且比较强大

参考资料

https://www.npmjs.com/package/@hasnat/s3fs
https://www.npmjs.com/package/readable-stream
https://www.npmjs.com/package/duplexify
https://www.npmjs.com/package/s3-streams
https://github.com/maxogden/mississippi
https://nodejs.org/docs/latest-v17.x/api/stream.html#class-streampassthrough

posted on 2022-06-03 19:06  荣锋亮  阅读(485)  评论(0编辑  收藏  举报

导航