java 实现生成txt压缩后返回客户端,不知道哪错了。生成的压缩文件都是损坏的

try {
OutputStream os = res.getOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(baos);
ZipEntry entry = new ZipEntry("goods.txt");
zipOut.putNextEntry(entry);
zipOut.write(bytes, 0, bytes.length);

               res.reset();
               res.setContentType("application/OCTET-STREAM;charset=GBK");
               res.setHeader("pragma", "no-cache"); 
               res.addHeader("Content-Disposition", "attachment;filename=goods.zip");
               os.write(baos.toByteArray(), 0, baos.toByteArray().length);
               zipOut.flush();
               zipOut.closeEntry();
               baos.close();
               zipOut.close();
               os.close();
          } catch (Exception e) {
                logger.error(e,e);
            }

6个回答

请参看,希望对你有用
http://snowolf.iteye.com/blog/644591

在os.close();之前添加os.flush();试一下呢

QKKLA
QKKLA 不行,压缩包可以打开,它是byte数据没有写到压缩包内的条目里去。压缩包文件条目大小为0
大约 5 年之前 回复
QKKLA
QKKLA 不行,压缩包可以打开,它是byte数据没有写到压缩包内的条目里去。压缩包文件条目大小为0
大约 5 年之前 回复

有谁遇到过这种问题吗?

不要沉了,有人会吗?

我感觉是不是你的关闭顺序有问题啊。
FileOutputStream f=new FileOutputStream("text.zip");
CheckedOutputStream csum=new CheckedOutputStream(f,new Adler32());
ZipOutputStream zos=new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
zos.setComment("A test of Java Ziping!");

BufferedReader in =new BufferedReader(new FileReader("123.txt"));
zos.putNextEntry(new ZipEntry("123.txt"));
int c;
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.flush();
out.close();
}

ligyu110
老李家的小二 回复ligyu110: 把这块换成你的输出就可以啦
大约 5 年之前 回复
ligyu110
老李家的小二 回复QKKLA: BufferedReader in =new BufferedReader(new FileReader("123.txt")); zos.putNextEntry(new ZipEntry("123.txt")); int c; while((c = in.read()) != -1){ out.write(c); } in.close();
大约 5 年之前 回复
QKKLA
QKKLA 你的代码,是读取123.txt文件把它压缩在text.zip里面,我是要自动生成txt后直接压缩返回一个zip下载,中间是不生成任何文件的。
大约 5 年之前 回复
QKKLA
QKKLA 关闭顺序,我之前也试过。
大约 5 年之前 回复
QKKLA
QKKLA 关闭顺序,我之前也试过。
大约 5 年之前 回复

问题已解决:

/**
* 压缩数据返回客户端
* @param req
* @param res
* @param bytes
* @throws Exception
*/
public static void zip(HttpServletRequest req, HttpServletResponse res,byte[] bytes) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

        compress(bais, baos);
        OutputStream os = res.getOutputStream(); 
        res.reset();
        res.setContentType("application/zip");
        res.setHeader("pragma", "no-cache"); 
        res.addHeader("Content-Disposition", "attachment;filename=goods.zip");
        byte[] output = baos.toByteArray();  

        os.write(output, 0, output.length);

        baos.flush();  
        baos.close();  
        bais.close();  
        os.close();
    }




     /** 
     * 数据压缩 
     *  
     * @param is 
     * @param os 
     * @throws Exception 
     */  
    public static void compress(InputStream is, OutputStream os)  
            throws Exception {  

        ZipOutputStream zipOut = new ZipOutputStream(os);
        ZipEntry entry = new ZipEntry("goods.txt");
        zipOut.putNextEntry(entry);

        int count;  
        byte data[] = new byte[2048*2];  
        while ((count = is.read(data, 0, data.length)) != -1) {  
            zipOut.write(data, 0, count);  
        }  
        zipOut.closeEntry();
        zipOut.finish();  
        zipOut.flush();  
        zipOut.close();  
    }  
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐