从服务器读取指定名称的文件,并下载到本地(默认在计算机的“下载”目录中)
前端 easyui表格的操作按钮列
// 列表编辑按钮
function operation(value, row) {
if(row.runStep == 'finish'){
if(row.exportStatus == true){
return "<a class=\"btn btn-success btn-xs\" href=\"${basePath}/dm/exportFileLog/downloadFile?id="+row.id+"\" ><i class=\"fa fa-cog\"></i>下载</a>";
}if(row.exportStatus == false){
return "<a class=\"btn btn-magenta btn-xs\" href=\"javascript:sensitiveReportPage()\" ><i class=\"fa fa-cog\"></i>涉敏报告</a>";
}
}if(row.runStep == 'fail'){
return "<a class=\"btn btn-danger btn-xs\" href=\"javascript:errorLogPage()\" ><i class=\"fa fa-file-text-o\"></i>失败日志</a>";
}else{
return "-";
}
}
后端下载方法
/**
* 下载文件
* @param id
* @param response
* @return
*/
@RequestMapping("downloadFile")
public Object downloadFile(Integer id,HttpServletResponse response){
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
BdpExportFileLogPo po = exportFileLogService.getById(id);
String fileName = po.getFileName()+".csv";
File file = new File(po.getFilePath()+fileName);
// 读取字符编码
String utf = "UTF-8";
// 设置响应
response.setContentType("application/ms-txt.numberformat:@");
response.setCharacterEncoding(utf);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=30");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, utf));
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
os.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });
int i = bis.read(buffer);
while (i != -1) {
//加上UTF-8文件的标识字符,解决excel打开时中文乱码问题。
os.write(buffer, 0, i);
i = bis.read(buffer);
}
}catch (Exception e){
logger.error("文件导出失败",e);
}finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
实现效果
点击【下载】按钮,在页面下方显示下载进度,并在“下载”目录中生成文件。
特别注意
下载后的 csv 文件用 WPS 可以正常打开,但是在用 excel 打开时,就会出现中文乱码。写出文件时加上一下内容即可解决。参考文章
//加上UTF-8文件的标识字符,解决excel打开时中文乱码问题
os.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });