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 ...
随机推荐
- Oracle12c ASMM和hugepage
在Oracle 12c,测试发现默认并不启用AMM 特性,而是使用了ASMM.因为在X86 架构下的linux 平台中,配置hugepage时,也是需要关闭AMM,使用ASMM特性. AMM分配内存的 ...
- curl_init raw传递json参数
protected function curl_vm_record($url, $platform, $authorization, $jsonStr) { $ch = curl_init(); cu ...
- drf 视图源码详解
目录 mixin类和Generic类 CreateModelMixin 创建 ListModelMixin - 查看多条数据 RetrieveModelMixin 获取单条数据 UpdateModel ...
- Arduino的小灯亮起来~~~
呵呵呵~~~昨天宝宝,就守着板子,跟说明书,心里默念,怎么特么还不亮?这个 东西怎么还不出!?~ 我特么没插线,可不不出么... 然后找那跟儿蓝色(我这个是蓝色的,不知道 有没有别的颜色的)的带USB ...
- Pku2054 Color a Tree
有一个N个结点的有根树,1是这个树的根.现在要对这N个结点依次进行染色,每个结点染色要花费1个单位的时候,同时要满足一个结点仅在其父亲被染色后才可被染色,每个结点有个权值Ci,如果我们在第Ti时间对i ...
- tensorflow和pytorch的区别
pytorch是动态框架,tensorflow是静态框架 针对tensorflow,我们先构造了一个计算图,构建完之后,这个计算图就不能改变了,我们再开启会话,输入数据,进行计算.那么这个流程就是固定 ...
- 前端 CSS的继承性
css有两大特性:继承性和层叠性 继承性 继承:给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 记住:有一些属性是可以继承下来 : color . font-*. text- ...
- python 操作ssh登录
import paramiko #创建SSH对象 ssh = paramiko.SSHClient() #把要连接的机器添加到known_hosts文件中 ssh.set_missing_host_k ...
- SQL基本语法和书写格式
插入 insert [into] 表名 [(列名列表)] values (值列表) insert into 新表名 (列名列表) select 列名列表 from 表名 select 表名.列名 in ...
- Redis基础都不会,好意思出去面试?
作者:张君鸿 juejin.im/post/5d078cd6f265da1b8466e62c Redis的数据结构 Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据 ...