直接上代码。
我这个使用的Servlet做的测试,以后可以根据实际情况改变自己需要的环境。
方法名字是download.
public void download( HttpServletRequest request, HttpServletResponse response) {
//前端页面将自己需要的文件名字拿过来。这个名字直接拼接到文件所在服务器的相对路径。这里为便于测试。我直接把名字写死,以后使用的时候
//根据实际业务进行修改。
String fileName = request.getParameter("file");
System.out.println(fileName);
try {
//mac系统,所以路径是这样子的。win系统就是D盘什么什么的
String path = "/Users/xuming/Downloads/"+"1234.docx";
//这里是下载以后的文件叫做什么名字。我这里是以时间来定义名字的。
downCfg(System.currentTimeMillis()+".docx", request, response);
OutputStream out;
FileInputStream inputStream = new FileInputStream(path);
out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
inputStream.close();
out.close();
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private void downCfg(String fileName, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
// 判断浏览器,进行不同的加密,这样下载的时候保存的文件名就不会乱码
String userAgent = request.getHeader("User-Agent");
// 针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
// 非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
response.setContentType("application/octet-stream;charset=utf-8");
response.setCharacterEncoding("UTF-8");
}