Jsp页面实现文件上传下载(1)

    技术2022-05-19  29

    http://www.blueidea.com/tech/program/2008/5258_2.asp

    JSP文件下载类整理完成。可以在JSP页面中实现简单的下载,支持文件打包下载功能。支持将字符串或者流生成文件提供下载的功能。但是也有一些缺点。现把这个类的基本介绍总结如下。

    名称:jsp页面下载类作者:SinNeRMail:vogoals[at]hotmail.com

    特点及功能介绍:

    支持单文件下载。支持多文件zip压缩下载。多文件zip压缩可在服务器保留或者删除副本。支持将特定的字符串或者byte数组以指定的文件名提供下载。 在下载过程中需要提供response对象。并且选择下载形式。 下载处理前先进行check,避免出现错误。 下载处理过程中出错时,会报告错误信息。 日文系统下文件名是中文时出现乱码问题。 处理前需要进行相对繁琐的设定。

    现介绍下使用者可见的方法的功能。

    设定实现下载必须的response对象。public void setResponse(HttpServletResponse response)

    设定下载方式:0 为普通单文件下载。 1 为多文件压缩成zip包下载。 2 为将指定的字符串等拼接成文件内容提供给用户下载。public void setDownType(int fileType)

    设定下载时显示给用的文件名。public void setDisFileName(String fileName)   

    压缩文件下载时,设定压缩文件暂时保存的路径(路径为绝对路径)public void setZipFilePath( String path )   

    压缩文件下载时,设定服务器端生成的压缩文件是否删除。True 删除;false 保留。public void setZipDelFlag(boolean b)    压缩文件下载时,设定要压缩的文件的文件路径(路径为绝对路径)public void setZipFileNames(String[] fileNames)

    单文件下载时,设定下载文件的路径(绝对路径)public void setDownFileName(String fileName)   

    将字符串生成文件内容模拟下载时,设定文件的内容。参数为字符串(可多次调用)public int setFileContent(String fileContent)

    将字符串生成文件内容模拟下载时,设定文件的内容。参数为byte数组(可多次调用)返回值:0 操作正常; 9 出现IO异常。public int setFileContent(byte[] fileContent)    将字符串生成文件内容模拟下载时,调用此方法结束文件内容设定。返回值:0 操作正常; 9 出现IO异常。public int setFileContentEnd()    主处理函数。返回值:    0   处理正常;1  未设定response对象。 2  未设定文件下载方式。  3   未设定要显示的文件名。  4  未设定要下载的文件路径,或者设定的下载的文件路径不存在。  9  IO异常。public int process()

    现在介绍不同下载模式下的简单流程:

    单文件下载流程:

    //实例初始化JspFileDownload jfd = new JspFileDownload();//设定response对象    jfd.setResponse(response);//设定文件下载模式 0 单文件下载。jfd.setDownType(0);//设定显示的文件名 xxxx.xxxjfd.setDisFileName(filename);//设定要下载的文件的路径,绝对路径jfd.setDownFileName(filePath);//主处理函数。注意处理返回值。int result = jfd.process();

    多文件压缩成ZIP文件下载:

    //实例初始化JspFileDownload jfd = new JspFileDownload();//设定response对象。jfd.setResponse(response);//设定下载模式 1 多文件压缩成ZIP文件下载。jfd.setDownType(1);//设定显示的文件名jfd.setDisFileName(filename);//设定要下载的文件的路径(数组,绝对路径)jfd.setZipFileNames(fileNames);//设定服务器端生成的zip文件是否保留。 true 删除  false 保留,默认为falsejfd.setZipDelFlag(true);//设定zip文件暂时保存的路径 (是文件夹)jfd.setZipFilePath(zipfolder);//主处理函数 注意返回值Int result = jfd.process();

    将字符串生成为文件内容,模拟文件下载:

    //实例初始化JspFileDownload jfd = new JspFileDownload();//设定response对象。jfd.setResponse(response);//设定下载模式 2 将字符串作为文件内容,实现文件下载。jfd.setDownType(2);//设定文件显示的名称。jfd.setDisFileName(request.getParameter("filename"));//主处理函数,下载前check,注意返回值out.print(jfd.process());//设定要写入文件的内容,参数可为字符串或者byte数组。可多次调用。jfd.setFileContent(request.getParameter("name"));//文件内容设定完了,调用函数。    jfd.setFileContentEnd();

    以上就是简单的使用介绍。下面贴出主处理类的代码。由于在日文系统下编辑的文件。注释只能写英文,英文太差-_-b。多包涵。

    package com.vogoal.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 java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import javax.servlet.http.HttpServletResponse;/** vogoalAPI 1.0* Auther SinNeR@blueidea.com* by vogoal.com* mail: vogoals@hotmail.com*//*** JSP FILE DOWNLOAD SUPPORT* * @author SinNeR* @version 1.0*/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("UTF-8");            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;    }}

    至此,jsp页面文件下载介绍完成。使用的时候,把这个类生成的class文件拷贝到WEB-INF/classes下。(注意保持包的路径)

    然后在使用的页面import进这个class即可。<%@ page contentType="text/html;charset=GBK"%>

    注意:可能存在编码方式的问题,如果出现或者有别的bug请联系我,我来debug。

    附件为这个类的source以及测试程序。

    附件说明:

    单文件下载测试程序请求页面:downloadSimpleFile.html 下载功能实现页面:downloadSimpleFile.jsp 多文件压缩成zip文件下载的测试程序请求页面:downloadZipFile.html 下载功能实现页面:downloadZipFile.jsp 字符串生成文件内容模拟文件下载的测试程序。请求页面:downloadStreamFile.html下载功能实现页面:downloadStreamFile.jsp Source及class文件。Source WEB-INF/src/com/vogoal/util/ JspFileDownload.javaClass文件WEB-INF/classes/com/vogoal/util/ JspFileDownload.class

    最新回复(0)