1、编写工具类
public class FileUtil {
/**
* 通过文件地址下载文件
*
* @author yys
* @Date 2022-12-20 15:49:49
* @Param [path:文件路径, request, response]
* @return void
**/
public static void downloadFile(String path,HttpServletRequest request, HttpServletResponse response) {
try {
//关键点,需要获取的文件所在文件系统的目录,定位准确才可以顺利下载文件
File file = new File(path);
//创建一个输入流,将读取到的文件保存到输入流
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 重要,设置response的Header
String name = file.getName();
response.setHeader("Content-Disposition", "attachment;filename=" + new String(name.getBytes("utf-8"),"ISO8859-1"));
response.setHeader("Content-Length", "" + file.length());
//octet-stream是二进制流传输,当不知文件类型时都可以用此属性
response.setContentType("application/octet-stream");
//跨域请求,*代表允许全部类型
response.setHeader("Access-Control-Allow-Origin", "*");
//允许请求方式
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
//用来指定本次预检请求的有效期,单位为秒,在此期间不用发出另一条预检请求
response.setHeader("Access-Control-Max-Age", "3600");
//请求包含的字段内容,如有多个可用哪个逗号分隔如下
response.setHeader("Access-Control-Allow-Headers", "content-type,x-requested-with,Authorization, x-ui-request,lang");
//访问控制允许凭据,true为允许
response.setHeader("Access-Control-Allow-Credentials", "true");
//创建一个输出流,用于输出文件
OutputStream oStream = new BufferedOutputStream(response.getOutputStream());
//写入输出文件
oStream .write(buffer);
oStream .flush();
oStream .close();
System.out.println("下载文件" + name +"成功");
} catch (Exception e) {
System.out.println("下载文件出错,错误原因:" + e);
}
}
}
2.控制器:通过文件流上传文件
public static final String UP_LODE_FOLDER = "D:/renren/uploadPath/yingjiEnterprisePlan/";
/**
* 企业文件上传
*
* @author yys
* @Date 2022-12-20 11:07:46
* @Param [file]
* @return io.renren.commons.tools.utils.Result
**/
@PostMapping("/fileUpload")
@ApiOperation("应急预案附件上传")
@LogOperation("应急预案附件上传")
public Result otherPicturesUpload (@RequestParam("file") MultipartFile file) {
try{
String originalFilename = file.getOriginalFilename();
String flag = IdUtil.fastSimpleUUID();
String rootFilePath =UP_LODE_FOLDER+ flag + "/" + originalFilename;
FileUtil.writeBytes(file.getBytes(),rootFilePath);
return new Result<>().ok(rootFilePath);
}catch (IOException e){
return new Result<>().error(e.getMessage());
}
}
3.控制器下载接口
通过map传路径
地址及其map参数举例/emergency/parkplan/preview?filePath=D:\renren\uploadPath\yingjiParkPlan
注意不要使用ajax,使用js跳转之类的
/**
* 下载接口
*
* @author yys
* @Date 2022-12-26 15:31:15
* @Param [map, request, response]
* @return io.renren.commons.tools.utils.Result
**/
@GetMapping("/preview")
public Result selectVersions(@RequestParam Map<String,String> map, HttpServletRequest request, HttpServletResponse response){
String filePath = map.get("filePath");
if (filePath!=null){
io.renren.utils.FileUtil.downloadFile(filePath,request,response);
return new Result<>().ok("下载成功");
}else {
return new Result<>().error("文件未上传,下载失败");
}
}