上代码
具体逻辑都在代码注释中体现!
@GetMapping("/downModel")
public AjaxResult downModel(HttpServletResponse response) {
//本地资源路径
String path = "";
//文件名
String fileName = "";
//创建文件对象
File file = new File(path);
if(!file.exists()){
return AjaxResult.error("文件下载失败,请联系管理员!");
}
// 设置媒体类型为二进制流,不知道下载文件类型时使用
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); //"application/octet-stream"
//此报文头content-disposition,对报文体进行描述,规定了接收端的显示处理行为。
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
//创建输入流,用于读取本地文件
InputStream is = null;
try{
is = new FileInputStream(file);
//is输入流的内容copy到输出流。内部源码下面会介绍,很简单的
IOUtils.copy(is,response.getOutputStream());
//Flushes this output stream and forces any buffered output bytes to be written out.
//正如上所说刷新此输出流,强制写出
response.getOutputStream().flush();
}catch (Exception e){
return AjaxResult.error("文件下载失败,请联系管理员!");
}finally {
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
IOUtils.copy源码
本质上就是跟将输入流转为输出流。buffer为缓冲区
//buffer 默认大小 1024*4
public static long copyLarge(final InputStream input, final OutputStream output, final byte[] buffer)
throws IOException {
long count = 0;
int n;
// EOF = -1,
// 当input(输入流)读到末尾时,返回-1.所以不等于-1的还要继续读,并且转换为output(输出流)
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
前端代码
很简单使用a标签指明后端路径就好
<a href = "url" />