SpringMVC下载文件(link形式,form 形式和ajax形式)
三种形式:
- link直接下载文件 (文件必须已经存在)
- 点击链接调用后端接口下载文件
- ajax方式下载文件
1. link直接下载
<h1>link直接下载</h1>
<a href="/upload/测试.csv" value="下载">文件下载</a>
2.点击链接调用后端接口下载
-
工具类
DownloadUtil
- 用来设置下载文件的response的格式和文件名
- 转换文件名,防止下载的时候文件名是乱码
package com.min.spring.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class DownloadUtil {
//设置下载文件的response的格式和文件名
public static HttpServletResponse setResponseForDownload(HttpServletResponse response, String filename) {
//配置response内容
response.reset();
response.setCharacterEncoding("UTF-8");
//设置为二进制
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
return response;
}
//转换文件名,防止下载的时候文件名是乱码
public static String filenameEncode(HttpServletRequest request, String filename) throws UnsupportedEncodingException {
String userAgent = request.getHeader("User-Agent");
if (/* IE 8 至 IE 10 */
userAgent.toUpperCase().contains("MSIE") ||
/* IE 11 */
userAgent.contains("Trident/7.0")) {
filename = URLEncoder.encode(filename, "UTF-8");
} else if (userAgent.toUpperCase().contains("MOZILLA") ||
userAgent.toUpperCase().contains("CHROME")) {
filename = new String(filename.getBytes(), "ISO-8859-1");
} else {
filename = URLEncoder.encode(filename, "UTF-8");
}
return filename;
}
}
html
<h1>链接下载</h1>
<a href="/test/getDownload?filename=测试文件.txt">a标签下载</a>
<!--form提交-->
<h1>form提交</h1>
<form action="/test/getDownload" method="get">
<input type="submit" value="input_submit" />需要在form中提交<br/>
<button type="submit" value="button_submit" >button_submit提交</button>需要在form中提交
</form>
接口代码(Get方式)
@RequestMapping(value = "test/getDownload", method = RequestMethod.GET)
@ResponseBody
public void getDownload(
@RequestParam(required = false) String searchString,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
//下载文件名的设置 方式1:自定义文件名
String filename = "测试get.txt";
//下载文件名的设置 方式2:采用传递过来的参数作为文件名
// String filename = request.getParameter("filename");
//转换文件名,防止下载的时候文件名是乱码
filename = DownloadUtil.filenameEncode(request, filename);
//设置下载文件的response的格式和文件名
response = DownloadUtil.setResponseForDownload(response, filename);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("这是测试文件get".getBytes());
outputStream.flush();
outputStream.close();
}
3.ajax方式下载文件(POST方式)
该ajax代码分为2步
- 第一步, 利用
preDownload
检查下载前的检查操作,如果失败可以停止下载操作 - 第二步,第一步没有失败的情况下,动态创建一个form来提交请求
HTML
<h1>AJAX下载文件</h1>
ajax下载时会动态创建一个form提交请求<br/><br/>
下载时传送的参数<input type="text" id="searchString" value="">
<button id="ajax_download" value="ajax下载" onclick="download()">下载</button>
<script src='/static/assets/js/jquery-2.0.3.min.js'></script>
<script>
function download() {
var searchString = $("#searchString").val();
$.ajax({
url: "/test/preDownload",
method: "post",
data: {
searchString: searchString
},
success: function (response, status, request) {
var disp = request.getResponseHeader('Content-Disposition');
if (response != "OK") {
alert("检查失败");
return;
}
var form = $('<form method="POST" action="/test/postDownload">');
var mySearchString = $('<input type="hidden" name="searchString"/>');
mySearchString.attr("value", searchString)
form.append(mySearchString);
$('body').append(form);
form.submit().remove();
}
})
}
</script>
接口代码(POST方式)
** 不生成服务器文件,直接写数据流
** searchString为传递的参数. 在业务中可以参数可以是作为筛选数据的条件.
//用来做下载前的检查等操作
@RequestMapping(value = "test/preDownload", method = RequestMethod.POST)
@ResponseBody
public String preDownload(
@RequestParam(required = false) String searchString,
HttpServletRequest request,
HttpServletResponse response) {
return "OK";
}
//下载接口
@RequestMapping(value = "test/postDownload", method = RequestMethod.POST)
@ResponseBody
public void postDownload(
@RequestParam(required = false) String searchString,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
//下载文件名的设置 方式1:自定义文件名
String filename = "测试post.xml";
//下载文件名的设置 方式2:采用传递过来的参数作为文件名
// String filename = request.getParameter("filename");
//转换文件名,防止下载的时候文件名是乱码
filename = DownloadUtil.filenameEncode(request, filename);
//设置下载文件的response的格式和文件名
response = DownloadUtil.setResponseForDownload(response, filename);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("这是测试文件post\n".getBytes());
outputStream.write(("这个是传送过来的参数:"+searchString).getBytes());
outputStream.flush();
outputStream.close();
}