aawwmate 2010-07-29 15:11
浏览 466
已采纳

关于jsp打包zip文件下载的问题,请帮忙解决。

我现在需要在项目中实现对多个文件打包成zip下载。从网上找到一段代码如下,可用,但是,会提示getOutputStream已经被called的异常。不知道哪里的问题,请帮忙解决。
另外这个代码是先保存为文件,然后再向reaponse输出流的,有没有直接压缩后就输出不保存本地文件的方法,请指教。
另外,如果能够实现一次压缩多个文件夹就更好了。
还有,zip文件是不是可以附带文本性的注释的呢?
[code="java"]
package com.xinkao.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tools.zip.*;
import javax.servlet.http.HttpServletResponse;

public class JspFileDownload {
/** request object */
private HttpServletResponse response = null;

/** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/
private int fileType = -1;

/** file name to be displayed */
private String disFileName = null;

/** zip file path */
private String zipFilePath = null;

/** file to be zipped */
private String[] zipFileNames = null;

private boolean zipDelFlag = false;

/** file to be downloaded */
private String downFileName = null;

/** error code 0 */
private static final int PROCESS_OK = 0;

/** error code 1 */
private static final int RESPONSE_IS_NULL = 1;

/** error code 2 */
private static final int UNSET_DOWNLOADTYPE = 2;

/** error code 3 */
private static final int UNSET_DIS_FILE_NAME = 3;

/** error code 4 */
private static final int UNSET_DOWN_FILE_NAME = 4;

/** error code 9 */
private static final int IO_EXCEPTION = 9;

/**
 * set response object
 * @param response response Object
 */
public void setResponse(HttpServletResponse response){
    this.response = response;
}

/**
 * set file type 0 normal file; 1 zip file ;2 stream
 * @param fileType
 */
public void setDownType(int fileType){
    this.fileType = fileType;
}

/**
 * set display file name
 * @param fileName
 */
public void setDisFileName(String fileName){
    this.disFileName = fileName;
}

/**
 * set zip file path
 * @param fileNames
 */
public void setZipFilePath( String path ){
    this.zipFilePath = path;
}

public void setZipDelFlag(boolean b){
    this.zipDelFlag = b;
}

/**
 * set zip file names
 * @param fileNames
 */
public void setZipFileNames(String[] fileNames){
    this.zipFileNames = fileNames;
}

/**
 * set download file name
 * @param fileName
 */
public void setDownFileName(String fileName){
    this.downFileName = fileName;
}

/**
 * set file content
 * @param fileContent
 */
public int setFileContent(String fileContent){  
    try{    
        byte[] buffs = fileContent.getBytes("GBK");
        response.getOutputStream().write(buffs);
    }catch(IOException e){
        return IO_EXCEPTION;
    }
    return PROCESS_OK;
}

/**
 * set file content
 * @param fileContent
 */
public int setFileContent(byte[] fileContent){
    try{
        response.getOutputStream().write(fileContent);
    }catch(IOException e){
        return IO_EXCEPTION;
    }
    return PROCESS_OK;
}

/**
 * set file content end
 *
 */
public int setFileContentEnd(){
    try{
        response.getOutputStream().close();
    }catch(IOException e){
        return IO_EXCEPTION;
    }
    return PROCESS_OK;
}

/**
 * main process
 * @return
 */
public int process(){
    int status = PROCESS_OK;

    status = preCheck();
    if ( status != PROCESS_OK )
        return status;

    String fileName = disFileName;

    response.setContentType("APPLICATION/OCTET-STREAM");   
    response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
    int BUFSIZE = 1024 * 8;     
    int rtnPos = 0;
    byte[] buffs = new byte[ BUFSIZE ];
    FileInputStream inStream = null;
    ZipOutputStream zos = null;
    InputStream is = null;
    String filepath = null;
    try{

        if ( fileType == 0 || fileType == 1){
            if ( fileType == 0 ){
                filepath = downFileName;   
            }else{
                filepath = zipFilePath + fileName;
                String[] fileToZip = zipFileNames;          
                zos=new ZipOutputStream(new FileOutputStream(filepath));
                ZipEntry ze=null;
                byte[] buf=new byte[BUFSIZE];
                int readLen=0;
                for (int i= 0;i<fileToZip.length;i++){
                    File f= new File(fileToZip[i]);

                    ze=new ZipEntry(f.getName());
                    ze.setSize(f.length());
                    ze.setTime(f.lastModified());

                    zos.putNextEntry(ze);
                    is=new BufferedInputStream(new FileInputStream(f));
                    while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {
                        zos.write(buf, 0, readLen);
                    }
                    is.close();
                }
                zos.close();
            }

            inStream =new FileInputStream(filepath);   
            while((rtnPos=inStream.read(buffs)) >0)   
                response.getOutputStream().write(buffs,0,rtnPos);   
            response.getOutputStream().close();   
            inStream.close();
        }
        if ( zipDelFlag ){
            File fToDel = new File(filepath);
            fToDel.delete();
        }

    }catch(IOException e){
        return IO_EXCEPTION;
    }finally{
        try{
            if ( inStream != null ){
                inStream.close();
                inStream = null;
            }
            if ( zos != null ){
                zos.close();
                zos = null;
            }
            if ( is != null ){
                is.close();
                is = null;
            }
        }catch (IOException e){
        }
    }
    return status;
}

/**
 * pre check.
 * @return
 */
private int preCheck(){
    if ( response == null )
        return RESPONSE_IS_NULL;

    if ( disFileName == null || disFileName.trim().length() == 0 )
        return UNSET_DIS_FILE_NAME;
    if ( fileType == -1 )
        return UNSET_DOWNLOADTYPE;
    else if ( fileType == 0 ){
        if ( downFileName == null || downFileName.trim().length() == 0 )
            return UNSET_DOWN_FILE_NAME;
        else{
            if ( !isFile( downFileName ) )
                return UNSET_DOWN_FILE_NAME;
        }

    }else if ( fileType == 1 ){
        if ( zipFilePath == null || zipFilePath.length() == 0 )
            return UNSET_DOWN_FILE_NAME;
        else{
            if ( !isDirect(zipFilePath) )
                return UNSET_DOWN_FILE_NAME;
        }
        if ( zipFileNames == null || zipFileNames.length == 0 )
            return UNSET_DOWN_FILE_NAME;
        else{
            for ( int i=0;i<zipFileNames.length;i++ ){
                if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )
                    return UNSET_DOWN_FILE_NAME;
                else{
                    if ( !isFile( zipFileNames[i] ) )
                        return UNSET_DOWN_FILE_NAME;
                }
            }
        }
    }else if ( fileType == 2 ){
        //doing nothing
    }else{
        return UNSET_DOWNLOADTYPE;
    }
    return PROCESS_OK;
}

private boolean isFile(String fileName){
    File f = new File(fileName);
    if (!f.exists() || !f.isFile())
        return false;
    return true;
}

private boolean isDirect(String filePath){
    File f = new File(filePath);
    if (!f.exists() || !f.isDirectory())
        return false;
    return true;
}

}

[/code]

  • 写回答

4条回答 默认 最新

  • weixin_42525443 2010-07-30 14:24
    关注

    不好意思,还有一个问题没有看到,

    zos=new ZipOutputStream(new FileOutputStream(filepath));
    改成
    zos=new ZipOutputStream(response.getOutputStream());

    然后把下面读文件输出部分的删除掉,就可以实现不写文件直接输出.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞