Java对pdf文件进行压缩打包并执行下载

2022-06-22 00:00:00 执行 压缩 打包

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
做了稍微修改,使得更符合自己!
尊重知识原创,这就是实现压缩打包下载的整个流程!
直接读取压缩包文件,还在优化,后期会更新

    原文作者:f_assassin
    原文地址: https://blog.csdn.net/qq_41489195/article/details/82621063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章