Java浏览器弹出下载框,多个文件导出压缩包
项目里一直有这个功能,也一直没怎么注意,今天研究了一下
依据逻辑往下走:
首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管:
Map<String, Object> resultMap = pdfService.createPDF(dest,jsonObject);
//文件保存路径,不包含文件名,例:d:\\aaa\\uploadFileRoot\\
resultMap.put("filePath", savePath);
//文件名
resultMap.put("fileName", fileName); return JSON.toJSONString(resultMap);
然后前端接收返回值:
res = JSON.stringify(res)
var data = JSON.parse(res);
// 本地 将路径中的\\用字母z代替,需要注意,如果下面open里的方法有z就需要换字母,换成没有的,不然后面解析会出错
var a = data.filePath.replace(/\\/g, "z");
// 发布
// var a = data1.a.replace(/\//g, "z");
window
.open("/pdf/downLoadTemp.do?a="
+ a + "&b=" + data.fileName);
把这个代码单独放到一个方法中方便重用(如果中间文件不需要保存,可以在finally中删除这个文件):
@RequestMapping("downLoadTemp.do")
public void downLoadTemp(HttpServletRequest req,HttpServletResponse res,String a,String b) throws Exception {
String filePath = a.replace("z", downLoadTemp);// downLoadTemp如果项目在本地是\\,服务器是/ String fileName = b;// 保存窗口中显示的文件名
res.setContentType("APPLICATION/OCTET-STREAM"); /*
* 要显示到客户端的文件名转码是必需的,特别是中文名 否则可能出现文件名乱码甚至是浏览器显示无法下载的问题
*/
ServletOutputStream out = null;
// PrintWriter out = null;
InputStream inStream = null;
try {
fileName = res.encodeURL(new String(fileName.getBytes("UTF-8"), "ISO8859_1"));// res.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// inline
out = res.getOutputStream();
System.out.println(
filePath + toUtf8String(fileName) + "..........................................................");
inStream = new FileInputStream(filePath + toUtf8String(fileName)); // 下载需要加密
// DrmEdiClient.getInstance().encryptAuthFile(inStream,out,
// ?,?,?); // 循环取出流中的数据
byte[] by = new byte[1024];
int len;
while ((len = inStream.read(by)) > 0)
out.write(by, 0, len);
res.setStatus(res.SC_OK);
res.flushBuffer(); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
inStream.close();
}
}
既然写了这方面的,那就把多个文件打包下载也写了把:(fileInfo为我们公司的存储文件属性的类),这是我之前写的代码了,过去好久都忘了
if (list != null && list.size() > 0) {
Map<String, String> temp = new HashMap<String, String>();
//要下载的文件的集合
File[] fileArray = new File[list.size()];
Map<String, String> newName = new HashMap<String, String>();
for (int i = 0; i < list.size(); i++) {
FileInfo fi = list.get(i);
String deskName = new File(fi.getFilePath()).getName();
String fileName = fi.getFileName();
String fn = temp.get(fileName);
if (fn != null) {// 打包下载版本文件保证文件不同名
String uploadDate = DateUtil.format(fi.getUploadTime(),
"yyyyMMddHHmmss");
fileName = uploadDate + fileName;
if (i == 1) {
FileInfo _fi = list.get(0);
String _deskName = new File(_fi.getFilePath())
.getName();
String _fileName = _fi.getFileName();
String _uploadDate = DateUtil.format(
_fi.getUploadTime(), "yyyyMMddHHmmss");
_fileName = _uploadDate + _fileName;
newName.put(_deskName, _fileName);
}
}
temp.put(fileName, "");
newName.put(deskName, fileName);
File f = new File(fi.getFilePath());
fileArray[i] = f;
}
File zipFile = new File(new Date().getTime() + ".zip");
//ZipUtil为公司封装的zip下载工具类
ZipUtil.zip(fileArray, zipFile, newName); String pathSaveFile = zipFile.getAbsolutePath();// 要下载的文件
String fileName = "files.zip";// 保存窗口中显示的文件名
super.getResponse().reset();
super.getResponse().setContentType("APPLICATION/OCTET-STREAM"); /*
* 要显示到客户端的文件名转码是必需的,特别是中文名 否则可能出现文件名乱码甚至是浏览器显示无法下载的问题
*/
ServletOutputStream out = null;
InputStream inStream = null;
try {
fileName = super.getResponse().encodeURL(
new String(fileName.getBytes("GBK"), "ISO8859_1"));// super.getResponse().setHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\"");
// inline
out = super.getResponse().getOutputStream();
inStream = new FileInputStream(pathSaveFile); // 循环取出流中的数据
byte[] b = new byte[1024];
int len;
while ((len = inStream.read(b)) > 0)
out.write(b, 0, len);
super.getResponse().setStatus(super.getResponse().SC_OK);
super.getResponse().flushBuffer();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
if (inStream != null)
inStream.close();
zipFile.delete();
}
}
ZipUtil.zip的方法:
public static void zip(File[] files, File out, Map<String, String> newName)
{
if (files != null) {
Map<String, File> map = new HashMap();
for (File f : files) {
list(f, null, map);
}
if (!map.isEmpty()) {
try {
ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(out);
for (Map.Entry<String, File> entry : map.entrySet()) {
File file = (File)entry.getValue();
String name = null;
if ((newName != null) && (newName.size() > 0)) {
String deskName = file.getName();
name = (String)newName.get(deskName);
}
name = name == null ? (String)entry.getKey() : name;
ZipArchiveEntry zae = new ZipArchiveEntry(file, name);
zaos.putArchiveEntry(zae);
InputStream is = new FileInputStream(file);
byte[] b = new byte['?'];
int i = -1;
while ((i = is.read(b)) != -1) {
zaos.write(b, 0, i);
}
is.close();
zaos.closeArchiveEntry();
}
zaos.finish();
zaos.close();
} catch (IOException ex) {
log.error(ex.getMessage(), ex);
}
}
}
}
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i = ; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= && c <= ) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[];
}
for (int j = ; j < b.length; j++) {
int k = b[j];
if (k < )
k += ;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
Java浏览器弹出下载框,多个文件导出压缩包的更多相关文章
- 问题:解决上传文件IE浏览器弹出下载框bug?
控制器方法的返回值必须以String返回,再由js处理转换成json对象 $.ajaxFileUpload({ url: "/project/proj_conver_upload&quo ...
- JAVA导出excel 直接弹出下载框
转自:https://blog.csdn.net/qq_38423105/article/details/80782283 效果展示: 1.首先准备jar包 <dependency> ...
- 【Java】数据库查询的数据直接以指定文件类型下载到本地(弹出下载框)
欲实现的功能目标:当点击下图的导出数据文件时弹出文件下载框,默认csv格式,用户自定义下载的本地路径 遇到的问题: 1.项目之前做过一次下载,但是是使用了本地文件模板.用输入流读取文件模板,插入数据, ...
- 在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法
在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法 最近在做一个小东西,使用kindeditor上传图片的时候,自己写了一个上传的方法,按照协议规则通过ajax返回json ...
- java web 下载本地文件并弹出下载框
window.open("/dept/download") jsp代码 @RequestMapping(value = "/download", method ...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
https://blog.csdn.net/evangel_z/article/details/7332535
- Springmvc和poi3.9导出excel并弹出下载框
Springmvc 和 poi3.9 用java程序从数据库导出数据到excel(在博客园的第一篇原创博客) @RequestMapping(value = "/importexcel.ht ...
- 【第十七篇】easyui-datagrid 导出Excel (在客户端能弹出下载框)
//导出Excel function exportExcel(obj) { var SaleOrderNo = $("#SaleOrderNo").val().trim(); va ...
- POI文件导出至EXCEL,并弹出下载框
相关参考帖子 : [1]http://www.tuicool.com/articles/MnqeUr [2]http://www.oschina.net/question/253469_51638?f ...
随机推荐
- MySQL主从复制之异步模式
MySQL主从复制有异步模式.半同步模式.GTID模式以及多源复制模式,MySQL默认模式是异步模式.所谓异步模式,只MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之 ...
- Week 12 - 673.Number of Longest Increasing Subsequence
Week 12 - 673.Number of Longest Increasing Subsequence Given an unsorted array of integers, find the ...
- KETTLE——(三)数据输出
数据输出和数据输入基本差不多,KETTLE本身支持的数据输出方式也特别多,还是以数据库输出为例. 打开表输出的界面,简单介绍一下其功能: 就这个界面,如果不勾选[指定数据库字段],KETTLE ...
- c# 解决Socket问题——由于目标机器积极拒绝,无法连接
关于单机出现这种问题不多赘述,主要阐述服务机和客户机出现这种问题的解决办法. 1.检查防火墙 这种问题出现的最多,特别是你的服务机还是买的各家的云产品,比如阿里云就是到防火墙中添加出入站规则,Azur ...
- 阿里云SLB产品HTTP、HTTPS、UDP协议使用
1.http协议测试 第一步:添加http监听服务,前端端口为8080,后端端口为80,健康检查中检查端口为后端端口80: 第二步:在绑定的服务器上安装服务,步骤如下 centos系统中启动http协 ...
- 【FICO系列】SAP 关于SAP中的记账码的解释
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP 关于SAP中的记账码的解 ...
- [Udemy] ES 7 and Elastic Stack - part 2
Section 3: Searching with Elasticsearch query with json 分页返回 Sort full text 的内容不能用来sort, 比如movie的 ti ...
- How to increase timeout for your ASP.NET Application ?
How to increase timeout for your ASP.NET Application ? 原文链接:https://www.techcartnow.com/increase-tim ...
- 关于时间API
如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示时 ...
- Java多态性应用——多态数组、多态参数
多态数组: Person[] person = {new Person("张三", 32), new Student("李四", 21, 120, 90.0), ...