java通过读取pdf文件下载
新人一枚,有错的多包涵,也可以指出错误;多为自己留着回忆,方便直接查询。
最近要在管理系统上,添加一个帮助文档;就是点击”?”或者点击帮助,可以执行在新窗口打开pdf文件,同时执行打包下载;
也是在网上各种查找,也参考了很多方法;诸多的就是借用jar包;
这也是一种很有效的方法,下面就贴出自己执行打包下载的方式
首先观看前端代码,很简单:
如果不是要考虑压缩包形式下载,其实可以直接考虑js就可以完全实现
通过点击a标签onclick执行操作
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<div>
<a class="easyui-linkbutton help" onclick="helpWindow();downPDF();" href="javascript:;" data-options="iconCls:'icon-help-white',plain:true,iconAlign:'top',"></a>
</div>
onclick要同时执行2个操作时,可以通过”;”达到同时实现的功能
通过js就可以实现读取,同时执行下载功能;不需要借助第三方jar,也不用后端代码就可以实现
<script> //帮助手册 function helpWindow(){ var url = jsPath + "upload/帮助手册V2.0.pdf"; window.open(url,'width:100%,height:100%,top=0, left=0, toolbar=no, menubar=no, scrollbars=no,directories=no, resizable=no,location=no, status=no,scrollbars=no,resizable=no') } function downPDF(){ window.location=jsPath + "upload/帮助手册V2.0.rar"; }
这样简单,但是会对项目内存加大,同样的文件,要有pdf文件,也要有压缩文件;
看到一些方法后,适合自己的,进行了简单的优化下符合项目结构,同样通过点击,前端通过url进行后端处理,压缩打包下载;主要通过流实现,也不需要考虑预先给出一个压缩包所在的位置,动态选择下载存放位置,也包含了对诸多浏览器功能正常。
js依然相同,只是把function 做了简单修改,来请求url
function downPDF(){
//window.location=jsPath + "upload/帮助手册V2.0.rar";
window.location.href="<%=basePath%>HelpDocumentController/downPDF.do";
}
Controller 代码:
@RequestMapping("downPDF")
public void downPDF(HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException, IOException{
//响应头的设置
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
String str = null ;
PageData pd = new PageData(request);
//获取服务器下要下载文件打包的路径
String realPath = request.getRealPath("")+"\\upload\\";
String urlPath = request.getRequestURL()+"/upload/";//获取路径
urlPath = urlPath.replaceAll("/HelpDocumentController/readPdfFile.do", "");
String fileSerialno = MD5.MD5Encode(java.util.UUID.randomUUID().toString());
File file = new File(realPath);
File filelist[] = file.listFiles();
for(File f : filelist){
String filename = f.getName();
if(filename.endsWith("pdf")){
//logger.info("Existence of txt file : " + f.getAbsolutePath());
String pdfPathname = f.getAbsolutePath();
//pdfPathname = pdfPathname.replaceAll("D:\\soft\\apache-tomcat-7.0.53\\webapps\\pos\\upload", "");
str = pdfPathname.substring(pdfPathname.lastIndexOf("\\")+1,pdfPathname.length());
}
}
//String pdfpath = urlPath + str;
String billname = str.substring(0,str.lastIndexOf("."));
//设置压缩包的名字
//解决不同浏览器压缩包名字含有中文时乱码的问题
String downloadName = billname+".zip";
//返回客户端浏览器的版本号、类型
String agent = request.getHeader("USER-AGENT");
try {
//针对IE或者以IE为内核的浏览器:
if (agent.contains("MSIE")||agent.contains("Trident")) {
downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
} else {
//非IE浏览器的处理:
downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1");
}
} catch (Exception e) {
e.printStackTrace();
}
response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");
//设置压缩流:直接写入response,实现边压缩边下载
ZipOutputStream zipos = null;
try {
zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法
} catch (Exception e) {
e.printStackTrace();
}
//循环将文件写入压缩流
DataOutputStream os = null;
String modipath = request.getSession().getServletContext().getRealPath("/upload/"+str);
File files = new File(modipath);
if(files.exists()){
try {
//添加ZipEntry,并ZipEntry中写入文件流
//这里,加上i是防止要下载的文件有重名的导致下载失败
zipos.putNextEntry(new ZipEntry(str));
os = new DataOutputStream(zipos);
InputStream is = new FileInputStream(files);
byte[] b = new byte[100];
int length = 0;
while((length = is.read(b))!= -1){
os.write(b, 0, length);
}
is.close();
zipos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭流
try {
os.flush();
os.close();
zipos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
流的使用,之前学的不好,这次操作,更让自己学到了很多有用的知识;java压缩打包下载,是借鉴了
https://blog.csdn.net/wy123123000/article/details/73800866
做了稍微修改,使得更符合自己!
尊重知识原创,这就是实现压缩打包下载的整个流程!
直接读取压缩包文件,还在优化,后期会更新