// 下載文件
@RequestMapping("/downloadfile")
public String downloadfile(HttpServletRequest request, HttpServletResponse response, Model model) {
String realPath = request.getServletContext().getRealPath("uploadfiles");
// 這是獲取到uploadfiles目錄下的所有的文件
File fileDir = new File(realPath);
File[] files = fileDir.listFiles();
ArrayList<String> fileNames = new ArrayList<String>();
for (File file : files) {
fileNames.add(file.getName());
}
model.addAttribute("filenames", fileNames);
// 文件下載
String filename = request.getParameter("filename");
System.out.println("獲取到的參數===" + filename.toString());
if (filename != "") {
String filePath = null;
FileInputStream in = null;
ServletOutputStream out = null;
/** 需要設置兩個報頭
* application/x-msdownload 表明是一個要下載文件
* 設置接收數據的方式,將文件保存爲文件中的文件名稱 並解決漢字文件名出現的亂碼問題 但是火狐仍爲亂碼....
*/
response.setHeader("Content-Type", "application/x-msdownload");
// response.setHeader("Content-Disposition", "attachment;filename=" + toUTF8String(filename));
response.setHeader("Content-Disposition", "attachment;filename=" + toUTF8String(request, filename));
try {
in = new FileInputStream(realPath + "\\" + filename);
out = response.getOutputStream();
out.flush();
int aRead = 0;
byte b[] = new byte[1024];
while ((aRead = in.read(b)) != -1 & in != null) {
out.write(b, 0, aRead);
}
out.flush();
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return "success";
}
//經測試,能在谷歌和火狐上正常使用
private String toUTF8String(HttpServletRequest request, String fileName) {
try {
String agent = request.getHeader("User-Agent");
if (agent.contains("Firefox")) {
//火狐
fileName = "=?utf-8?B?" + new BASE64Encoder().encode(fileName.getBytes("utf-8")) + "?=";
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return fileName;
}
// 網上的 將中文轉化爲utf-8工具類 不可取
private String toUTF8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).
toUpperCase());
}
}
}
return sb.toString();
}
2.可在jsp中利用post進行提交
<form action="${pageContext.request.contextPath}/downloadfile" method="post" enctype="multipart/form-data">
<input type="text" name="filename">
<input type="submit" value="下載">
</form>
或是通過get請求也可以
http://localhost:8080/downloadfile/filename=20191120142438245.png
項目地址: https://gitee.com/yuexingyingxue/springMvcTest1