模板生成若干word文档,打压缩包下载

hening191 发布于 2016/02/18 16:04
阅读 236
收藏 0

我想用生成若干个word文件,然后再打个压缩包通过浏览器下载下来。单个下载word文件没问题,但是若干打了压缩包下载下来后,压缩包里的word文件全是空白文件,找不到原因,以下是代码:

            List<File> files = new ArrayList<File>();

                for(int f = 0;f<5;f++){
                    File file = new File(f+".doc");
                
                    //freemarker写打印文档表格
                    Configuration cfg = new Configuration();
                    cfg.setDefaultEncoding("utf-8");
                    cfg.setClassForTemplateLoading(this.getClass(),"/com/leo/rms/corecode/book/service/impl");
                    Template temp = cfg.getTemplate("model.ftl");
                    temp.setEncoding("utf-8");
                    Map<String,Object> dataMap = new HashMap<String,Object>();
                    for(int i=1;i<=50;i++){
                        dataMap.put("print_code"+i, "code"+i);
                        dataMap.put("print_count"+i, "count"+i);
                    }
                    
                    
                    
                    java.io.Writer wout = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
                    temp.process(dataMap, wout);
                    wout.close();
                    files.add(file);
                }
                
                
                
                
                File zipFile = new File("DownLoad.zip");//最终打包的压缩包
                ZipOutputStream zipStream = null;
                zipStream = new ZipOutputStream(new FileOutputStream(zipFile));//用这个构造最终压缩包的输出流
                
                for(int i=0;i<files.size();i++){
                
                    
                    @SuppressWarnings("unused")
                    FileInputStream zipSource = null;
                    @SuppressWarnings("unused")
                    BufferedInputStream bufferStream = null;
                    
                    
                    zipSource = null;//将源头文件格式化为输入流
                    zipSource = new FileInputStream(files.get(i));
                    
                    @SuppressWarnings("unused")
                    byte[] bufferArea = new byte[1024 * 10];//读写缓冲区
                    
                    //压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样
                    ZipEntry zipEntry = new ZipEntry(files.get(i).getName());
                    zipStream.putNextEntry(zipEntry);//定位到该压缩条目位置,开始写入文件到压缩包中
                }

                if(null != zipStream) zipStream.close();
                
                String fileName = "信息";
                // 解决中文文件名乱码问题
                if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
                    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
                } else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
                    fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
                } else if (request.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) {
                    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// 谷歌
                }
                InputStream fin = new FileInputStream(zipFile);
                response.setCharacterEncoding("utf-8");  
                response.setContentType("application/octet-stream");  
                // 设置浏览器以下载的方式处理该文件默认名
                response.addHeader("Content-Disposition", "attachment;filename="+ fileName+".zip");
                ServletOutputStream out = response.getOutputStream();
                byte[] buffer = new byte[512];  // 缓冲区  
                int bytesToRead = -1;  
                // 通过循环将读入的Word文件的内容输出到浏览器中  
                while((bytesToRead = fin.read(buffer)) != -1) {  
                    out.write(buffer, 0, bytesToRead);  
                }
                if(fin != null) fin.close();  
                if(out != null) out.close();  
                if(zipFile != null) zipFile.delete(); // 删除临时文件 
加载中
0
雨翔河
雨翔河

 代码尽量模块化,挨个测试下看是哪里的问题。如果你判断word没问题那么你搞几个纯文本文档试试压缩打包会不会出现这个问题。

另:代码直接粘贴过来的习惯不好哦,编辑器不是有代码模块吗。


返回顶部
顶部