1.安装minio
npm i --save minio@7.0.18
2.文件服务信息配置
export const baseUrlMinio = {
config:{
endPoint: 'xxxxxxxxx',
port: 9000,
useSSL: false,
accessKey: 'xxxxxxxxxxxxxxx',
secretKey: 'xxxxxxxxxxxxxxx'
},
bucket:'xxxxxxxxxxxxxxx',
auth:'http://'
};
3.utils函数准备
export function dateNumber(sp=''){
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth()>9?date.getMonth()+1:'0'+(date.getMonth()+1)
const day = date.getDate();
return year.toString()+month+day.toString()
}
export function getUUID () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)
})
}
4.minio业务逻辑
const Minio = require('minio');
import {dateNumber, getUUID} from '@/utils'
import {baseUrlMinio} from './config'
import {decodeDesString} from "@/plugins/crypto-js";
import axios from "axios";
const {config, bucket,auth} = baseUrlMinio
config.accessKey = decodeDesString(decodeDesString(config.accessKey))
config.secretKey = decodeDesString(decodeDesString(config.secretKey))
const minioClient = new Minio.Client(config)
export const minioUploads = (file, progress, success, error) => {
if (file.name.lastIndexOf('.') < 0) {
error({code: 500, msg: '文件格式错误,请重新上传'})
return false
}
if (file.size > 1024 * 1024 * 300) {
error({code: 500, msg: '文件大小不能超过300M'})
return false
}
const suffixType =file&&file.name?file.name.substr(file.name.lastIndexOf('.')):''
const UrlName = `${dateNumber()}/${getUUID()}${suffixType}`
minioClient.presignedPutObject(bucket, UrlName, 0.5 * 60 * 60, function (err, presignedUrl) {
if (err) {
error({code: 500, msg: '未获取到文件服务器,请联系管理员'})
return false
}
axios.put(presignedUrl, file, {
headers: {'Content-Type': file.type},
timeout: 1000 * 60 * 30,
onUploadProgress: function (progressEvent) {
progress({loaded:progressEvent.loaded,total:progressEvent.total,proNum:Number((progressEvent.loaded / progressEvent.total * 100).toFixed(0))})
}
}).then((res) => {
if (res.status !== 200) {
error({code: 500, msg: '文件上传失败,请联系管理员'})
return false
}
success({
data: {
url: `${auth}${config.endPoint}:${config.port}/${bucket}/${UrlName}`,
name: file.name,
size: file.size,
},
code: 0,
msg: '上传成功',
})
}).catch(() => {
error ({data: null, code: 500, msg: '上传异常,请联系管理员',})
})
})
}
5.使用
<el-upload
class="upload-demo"
ref="upload"
action=""
accept=".doc,.docx,image/*,.pdf,.jpg, .jpeg, .png,.xls,.xlsx"
:show-file-list="false"
:http-request="uploadFile">
<el-button size="small">点击上传</el-button>
</el-upload>
uploadFile(file) {
const fileObj = item.file;
minioUploads(fileObj,progress=>{
}, res=>{
})
},error=>{
})
},