代码示例
```bash
package com.ruoyi.web.controller.family;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import sun.misc.BASE64Encoder;
@RestController
@RequestMapping("/family/testxiazai")
public class TestxiazaiController {
/**
* 下载文件的demo
*/
@GetMapping("/doGet")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) {
File file = new File("E:\\图片\\张敏.jpg");
String fileName = "张敏.jpg";
downloadFile(fileName,file,response,request);
}
/**
* 下载文件
* @param originalFileName :下载文件的原始文件名
* @param file :下载的文件
* @param response :相应对象
*/
public static void downloadFile(String originalFileName, File file, HttpServletResponse response, HttpServletRequest request) {
// 数据校验
checkParam(originalFileName,file);
//相应头的处理
//清空response中的输出流
response.reset();
//设置文件大小
response.setContentLength((int) file.length());
//设置Content-Type头
response.setContentType("application/octet-stream;charset=UTF-8");
//设置Content-Disposition头 以附件形式解析
String encodedFilename = getEncodedFilename(request, originalFileName);
response.addHeader("Content-Disposition", "attachment;filename=" + encodedFilename);
//将来文件流写入response中
FileInputStream fileInputStream = null;
ServletOutputStream outputStream = null;
try {
//获取文件输入流
fileInputStream = new FileInputStream(file);
//创建数据缓冲区
byte[] buffers = new byte[1024];
//通过response中获取ServletOutputStream输出流
outputStream = response.getOutputStream();
int length;
while ((length = fileInputStream.read(buffers)) > 0) {
//写入到输出流中
outputStream.write(buffers, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//流的关闭
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下载文件的参数的校验,如果参数不合法则抛出自定义异常
* @param originalFileName :文件原始文件名
* @param file :待下载的文件
*/
private static void checkParam(String originalFileName, File file) {
if(StringUtils.isBlank(originalFileName)){
}
if(file == null || !file.exists() ){
}
}
/**
* 获取URL编码后的原始文件名
* @param request :客户端请求
* @param originalFileName :原始文件名
* @return :
*/
private static String getEncodedFilename(HttpServletRequest request, String originalFileName) {
String encodedFilename = null;
String agent = request.getHeader("User-Agent");
if(agent.contains("MSIE")){
//IE浏览器
try {
encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
encodedFilename = encodedFilename.replace("+", " ");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if(agent.contains("Firefox")){
//火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
encodedFilename = "=?utf-8?B?" + base64Encoder.encode(originalFileName.getBytes(StandardCharsets.UTF_8))+"?=";
}else{
//其他浏览器
try {
encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return encodedFilename;
}
}
参考文件https://blog.youkuaiyun.com/ycd500756/article/details/87907525?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161585922616780261983241%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161585922616780261983241&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-4-87907525.first_rank_v2_pc_rank_v29&utm_term=%E9%99%84%E4%BB%B6%E4%B8%8B%E8%BD%BD%E5%89%8D%E5%90%8E%E7%AB%AF%E4%BB%A3%E7%A0%81