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