minio介绍:
minio 是一款高性能、分布式的对象存储系统. 常用于储存项目中的图片,文件等。
express中使用minio
下载minio
npm install minio --save
在需要的地方引入minio
const Minio = require('minio') //minio分布式储存
配置minio配置项
let minioClient = new Minio.Client({
endPoint: 'XXX', // 本机内网ip 注意:不要携带http或https
port: XXX, //端口号默认为9000 如果有多个端口号需在服务器查看对应的端口
useSSL: false, // false代表不需要https
accessKey: 'XXX', // 账号
secretKey: 'XXX' // 密码
});
minio常用api
let isExist = await minioClient.bucketExists('XXX'); //查询minio是否有XXX桶 此处可判断如果没有这个桶便新建一个桶
minioClient.fPutObject('XXX', fileName, filePath); // 上传文件到XXX桶 上传后访问链接为 http://本机内网ip:端口号/桶名/fileName
express转换二进制文件为file文件
下载multiparty插件
npm install multiparty --save
引入multiparty
const multiparty = require("multiparty");
使用multiparty转换文件流
var form = new multiparty.Form()
form.parse(req,(err, fields, files)=>{ //此处的req为前端传过来的参数
if(err){
throw err
}else{
console.log(fields,files) // files中以键值对储存转换后的对象
console.log(files.XXX[0]) //XXX为前端传的键名 files.XXX[0].originalFilename可以做为上方minioClient.fPutObject方法中的fileName,files.photoRef[0].path可以做为上方minioClient.fPutObject方法中的filePath
}
})
最后附上完整代码
router.post("/uploadAvatar",(req,res,next)=>{
var form = new multiparty.Form()
form.parse(req,(err, fields, files)=>{
if(err){
throw err
}else{
console.log(fields,files)
//XXX代表接口参数的键名
uploadFile(files.xxx[0].originalFilename,files.xxx[0].path).then((res)=>{
//注意此处是一个promise对象 需要用.then获取参数
console.log("res",res)
res.send("图片上传成功")
})
}
})
})
async function uploadFile(fileName,filePath) {
//基本配置
let minioClient = new Minio.Client({
endPoint: 'xxx.xx.xx.xxx', // 本机内网ip
port: xxx,
useSSL: false, // 不需要https
accessKey: 'xx', // 账号
secretKey: 'xxxxx' // 密码
});
let isExist = await minioClient.bucketExists('xxx');
let err = '';
console.log('bucket is exist>>>',isExist);
if(!isExist) {
//创建桶后,需要在管理界面修改public访问权限,默认是private
err = await minioClient.makeBucket('xxx', 'cn-north-1');
}
if(!err) {
//上传文件
await minioClient.fPutObject('xxx', fileName, filePath);
console.log(fileName)
console.log('返回给前端的文件路径>>>','http://主机名:端口/桶名/');
return 'http://主机名:端口/桶名/' + fileName;
}
}