使用Java下载文件方式很常用,废话不多说,先说明一下情况。
场景:通过程序(或者定时任务)生成文件到服务器本地磁盘,数据库中保存文件生成信息(非重点),通过网页一链接下载服务器本地的文件。
开始动手,步骤如下:
1. 根据id查询出数据库文件生成信息(非重点)
2. 获取服务器的本地磁盘文件file对象
3. 设置HttpServletResponse属性
4. 获得文件输入流
5. 文件输入流和输出流转换
6. 文件流输出
完整代码如下:
/**
* 下载
* @author 小风
* @return 流
* @throws IOException
*/
@RequestMapping(value = "download", method = RequestMethod.GET)
public void download(HttpServletResponse response,@RequestParam(value = "id", required = true) String id) throws IOException {
if (null != id && !"".equals(id)) {
OrderExcel o = orderExcelService.selectOrderExportById(id);
if (o != null) {
File file = new File(Common.ORDER_EXCEL_EXPORT_SAVE_DIR_PATH + o.getId().trim()+".xls");
String fileName = o.getFileName();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
FileInputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b))!=-1){
os.write(b, 0, len);
}
os.flush();
os.close();
fis.close();
}
}
}
上述代码能实现excel文件的下载,数据正确,但是当文件名存在中文的时候,下载的文件名就存在了错误
解决方案为,文件名进行URLEncoder.encode编码,解决中文乱码问题
代码如下:
fileName = URLEncoder.encode(o.getFileName(), "UTF-8"); //解决下载文件名乱码
纯手打,欢迎拍砖。