文件下载
刚开始研究文件下载是找有关js的方法,找了好多发现对于.txt、.xls等文件在浏览器中还是打开,或者就是跨域问题。后来通过查找资料发现可以在后台对http相应头设置参数,而且实现起来也不复杂。现总结如下:
文章参考 《javaweb文件下载》、《根据网络url 实现web下载图片 java》、《Java文件下载及web文件的contentType大全》
前端代码:
function downloadLog(logName){
location.href=basePath + "/demp/common/downloadDeviceLog.do";
}
后台代码:
import org.apache.commons.io.IOUtils;
@RequestMapping({"/demp/common/downloadDeviceLog.do"})
@ResponseBody
public void downloadDeviceLog(HttpServletRequest request, HttpServletResponse response) throws Exception {
String logUrl = "https://**/2018-11-20.txt";
try {
String [] logUrlArray = logUrl.split("/");
String fileName = logUrlArray[logUrlArray.length-1];
URL url = new URL (logUrl);
URLConnection uc = url.openConnection();
response.setContentType("application/octet-stream");//设置文件类型
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setHeader("Content-Length", String.valueOf(uc.getContentLength()));
ServletOutputStream out = response.getOutputStream();
IOUtils.copy(uc.getInputStream(), out);
} catch (Exception e) {
e.printStackTrace();
}
}
注:
1、其中关键的一句是给响应头设置“content-disposition”属性,关于它的介绍可参考文章《Content-Disposition 响应头,设置文件在浏览器打开还是下载》
2、contenType也可以设置成专门针对某种文件类型的,比如文中是.txt类型,就可以这样设置:
response.setContentType("text/plain");//设置文件类型
3、最近将代码放在两台服务器上(两台tomcat编码相同),一台正常,一台报Server returned HTTP response code: 400 for URL,报错的地方在IOUtils.copy(uc.getInputStream(), out);后来发现代码引用的url里面含中文,去掉中文之后发现好了,但是还是不知道为什么两台服务器会出现不一样的情况,先贴出来,以后找到问题原因再补充。