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 ...
随机推荐
- code_action
w https://raw.githubusercontent.com/laravel/laravel/master/config/database.php <?php return [ /* ...
- 邻近双线性插值图像缩放的Python实现
最近在查找有关图像缩放之类的算法,因工作中需要用到诸如此类的图像处理算法就在网上了解了一下相关算法,以及其原理,并用Python实现,且亲自验证过,在次与大家分享. 声明:本文代码示例针对的是plan ...
- beanstalkd 安装和配置
安装 安装以centos为例 yum install beanstalkd 配置 使用centos yum安装,通过查看服务脚本发现有这个配置文件 cat /etc/sysconfig/beansta ...
- window10 本地搭建SVN服务器
window10本地搭建SVN服务器教程:https://www.cnblogs.com/warmlight/p/11075644.html 我按照这篇教程成功搭建SVN服务器. 有个比较坑的地方是w ...
- TensorFlow学习笔记6-数值计算基础
TensorFlow学习笔记6-数值计算 本笔记内容为"数值计算的基础知识".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的矩阵,其大小为m ...
- CEPH安装(CentOS 7)
以包含四个节点的集群为例,其中包括一个 ceph-deploy 管理节点和一个三节点的Ceph存储集群. 下图中每个节点代表一台机器. 安装 CEPH 部署工具 执行如下命令: sudo yum in ...
- STL 迭代器适配器(iterator adapter)
iterator adapter graph LR iterator --- reverse_iterator iterator --- Insert_iterator iterator --- io ...
- 使用SSI框架写的简单Demo(查询模块)
在网上看到好多个版本,自己有时间索性就写个Demo记录下整个框架的逻辑流程: 1.首先拷贝整个框架所需要的jar包到WEB-INF/lib包下(这个网上都可以搜到的) 2.配置文件的配置, 2.1.在 ...
- PCB电路设计 altiumdesigner(项目软件总结)
1.Altium designer 10在PCB里面复制粘贴,比CAD里面多一个动作,就是点击ctrl+C后,要左键点一下复制基点,比如某根线端点或者焊盘,再粘贴,就是基于刚才点的那个为基点粘贴了.2 ...
- Redis主从同步、哨兵、集群
什么是主从同步(复制) 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点 ...