文件上传:
前端:
自定义请求函数:
const handleFileUpload=(file,row)=>{
const formData = new FormData();
// console.log(file);
formData.append("file",file.file);
formData.append('id',row.id);
link(apiUrl.uploadHeadImageWithId,"POST",formData).then((result) => {
if(result.data.code===200){
console.log("图片地址",result.data.result);
row.headImageUrl = result.data.result;
ElMessage.success("图片上传成功");
}else if(result.data.code===500){
ElMessage.error("图片上传失败");
}
}).catch((err) => {
ElMessage.error("图片上传失败");
});
}
后端:
@ApiOperation("上传头像图片")
@PostMapping("/uploadHeadImageWithId")
public Result<String> uploadHeadImageWithId(
@RequestParam("file") MultipartFile file,
@RequestParam(name="id",required = true) Integer id) {
Result<String> result = new Result();
......
return result;
}
下载:
前端:
先封装请求
import service from "../util/service.js"
// 封装相关的数据请求
let fileDownload=(url,method='get',data,params)=>{
return new Promise((resolve,reject)=>{
service.request({
url,
method,
data, //post发送的相关数据
params, //get发送的相关数据
responseType: 'blob',
}).then((ok)=>{
resolve(ok)
}).catch((err)=>{
reject(err)
})
})
}
service.js对应的代码
import router from "@/router";
import axios from "axios";
import { ElMessage } from "element-plus";
// import { useStore } from "vuex";
// let store = useStore();
import store from '../store/index'
import apiUrl from "@/api/url";
let axiosurl="";
if(process.env.NODE_ENV==="development"){
axiosurl=process.env.VUE_APP_BASE_API
}else{
axiosurl=process.env.VUE_APP_BASE_API
}
//创建axios实例
const service = axios.create({
baseURL:axiosurl
})
//请求和响应拦截器
//添加请求拦截器
service.interceptors.request.use(function (config){
// console.log("添加请求头");
//在发送请求之前做什么,头部添加token
config.headers['Authorization'] = localStorage.getItem("Authorization"); // 添加Authorization头部 Bearer
// config.headers['Content-Type'] = 'application/json;charset=utf-8'; // 添加Content-Type头部 这个添加会造成文件上传错误
return config
},function(error){
return Promise.reject(error);
});
// 添加响应拦截器
service.interceptors.response.use(function (response){
// store = useStore(); //这个store布恩那个这么定义这么定义
let res = response.data;
if(res.code===401){
ElMessage.error("请登录");
store.commit("SET_NoLogined_BOOL");
localStorage.removeItem("user");
localStorage.removeItem("Authorization");
localStorage.removeItem("logined");
localStorage.removeItem('headImageUrl');
router.push('/login');
}else if(res.code===403){
router.push('/customerHome');
ElMessage.error("当前用户无权限");
}
//对响应数据做一些东西
return response;
},function(error){
console.log(error.code);
if(error.response===undefined){
ElMessage.error("无法连接后端服务器!");
router.push("/"); //和后端断开连接的时候转到首页
}else{
switch(error.response){
case 404:
ElMessage.error("资源不存在!")
break;
case 500:
ElMessage.error("服务器连接失败!")
break;
default:
ElMessage.error(error.response.status,"未知错误!")
break;
}
}
//对响应错误做一些东西
return Promise.reject(error);
})
export default service; //暴露的挂载在service上的内容
文件下载前端:
let downloadResumeWithId=()=>{
fileDownload(apiUrl.downloadResumeWithId,'get',{},{id:userInfo.data.id}).then(result => {
console.log(result);
const disposition = result.headers['content-disposition'];
// console.log('文件名',disposition)
if (disposition === undefined) {
ElMessage.error('未上传文件');
}else{
let fileName = disposition.substring(disposition.indexOf('filename=') + 9, disposition.length)
// 创建URL
const objectUrl = URL.createObjectURL(new Blob([result.data]))
// 通过a标签下载
const link1 = document.createElement('a')
link1.href = objectUrl
link1.download = fileName
document.body.appendChild(link1)
link1.click()
// 释放URL 对象
window.URL.revokeObjectURL(link1.href)
document.body.removeChild(link1)
}
}).catch((err) => {
ElMessage.error("下载失败");
});
}
文件下载后端:
@ApiOperation("下载简历文件")
@GetMapping("/downloadResumeWithId")
public Result<String> downloadResumeWithId(@RequestParam("id") Integer id, HttpServletResponse response ){
Result result = new Result();
try {
//。。。。。
minIoUtil.downloadFile(bucketName, fileName, response);
result.success("下载成功!");
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
result.error500("下载失败!");
}
return result;
}
minIoUtil.downloadFileh函数如下:
public void downloadFile(String bucketName, String fileName, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
InputStream fileStream = minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build()
);
// String[] strings = fileName.split("/");
// fileName = strings[strings.length - 1];
// System.out.println("filename=" + fileName);
String fileNameCode = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
// response.setContentType( "application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileNameCode);
ServletOutputStream outputStream = response.getOutputStream();
// 输出文件
int length;
byte[] buffer = new byte[1024];
while ((length = fileStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.flush();
fileStream.close();
outputStream.close();
}