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 ...
随机推荐
- 源码搭建mysql5.7.20
转载过来的文章,只是借用原文样式与框架,根据自己实验环境进行全面改动,仅供参考! 使用yum安装的MySQL一般版本比较旧,但是运行稳定.如果想要尝试最新的功能或者需要指定特殊的功能的话,就需要手工进 ...
- oracle 表连接 - sort merge joins 排序合并连接
https://blog.csdn.net/dataminer_2007/article/details/41907581一. sort merge joins连接(排序合并连接) 原理 指的是两个表 ...
- apache配置补充
apache的安装: 分成三种方式: tar包 rpm安装 yum安装. ============ tar包安装 ======================== 下载.tar.gz的安装包 解压和安 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_8_字节输入流_InputStream类&FileInputStream
inputStream
- requests模块(请求接口)
下面分别是get,post,入参json,添加cookie,添加header,上传/下载文件 的接口请求举例: import requests #导入模块 #1.发get请求 url = 'htt ...
- 在centos7.4 nginx mysql php部署 thinkphp5.0 项目
系统 centos7 环境 php 7.1.3 nignx 1.12.2 mysql 5.5.6 我是通过lnmp 集成环境安装 fastcgi.conf 末尾添加 vim fastcig.conf ...
- 安全运维 - Windows系统应急响应
挖矿病毒应急 传播方式: 通过社工.钓鱼方式下载和运行了挖矿程序(邮件.IM等) 利用计算机系统远程代码执行漏洞下载.上传和执行挖矿程序. 利用i算计Web或第三方软件漏洞获取计算机权限,然后下载和执 ...
- 在Keras中用Bert进行情感分析
之前在BERT实战——基于Keras一文中介绍了两个库 keras_bert 和 bert4keras 但是由于 bert4keras 处于开发阶段,有些函数名称和位置等等发生了变化,那篇文章只用了 ...
- TCP 和 UDP 的区别---还有一个UTP一
面试的时候会经常问到这些问题,所以要对比了解一下他们之间的差别,能讲出个所以然来.多积累多总结,懵逼中... TCP 和 UDP TCP与UDP基本区别 : 1.基于连接与无连接 2.TCP要求系统资 ...
- 【转载】如何编写ROS的第一个程序hello_world
目录 1.工作空间的创建 2.功能包的创建 3.功能包的源代码编写 4.功能包的编译配置 5.功能包的编译 6.功能包的启动运行 既然ROS已经成功安装好了,大家一定很想亲自动动手编一个通过起手式例程 ...