您的位置: 首页 > 技术文档 > 网络编程 > Jsp页面实现文件上传下载
ACCESS的参数化查询 回到列表 CSV文件的生成与分析
 Jsp页面实现文件上传下载

作者:SinNeR 时间: 2008-01-03 文档类型:原创 来自:蓝色理想

第 1 页 jsp页面实现文件上传
第 2 页 jsp页面实现文件下载

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

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

特点及功能介绍

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

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

设定实现下载必须的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.xxx
jfd.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 保留,默认为false
jfd.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以及测试程序。

附件说明

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

下载:jspDownloadClass.zip

以上文件为SinNeR劳动成果,归blueidea所有,转载请注明出处。

经典论坛讨论
http://bbs.blueidea.com/thread-2732283-1-1.html

本文链接:http://www.blueidea.com/tech/program/2008/5258.asp 

出处:蓝色理想
责任编辑:moby

上一页 jsp页面实现文件上传 下一页

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
CSV文件的生成与分析
Jsp常用功能——图片验证码
ThickBox 3.1 调用/演示/下载
免费下载《Connection》第2期
开源IXNA 聚合程序发布
作者文章
CSV文件的生成与分析
Jsp常用功能——图片验证码
热门搜索:CSS Fireworks 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
疯狂的程序员 第五十回
疯狂的程序员 第四十九回
疯狂的程序员 第四十八回
疯狂的程序员 第四十七回
疯狂的程序员 第四十六回
疯狂的程序员 第四十五回
疯狂的程序员 第四十四回
疯狂的程序员 第四十三回
疯狂的程序员 第四十二回
疯狂的程序员 第四十一回
栏目最新 栏目最新列表
火星人的耳机
公司正式宣布创业失败
用corelDEAW 12打造唇膏
二行代码解决全部网页木马
一行代码解决iframe挂马
Photoshop制作星空爆炸效果
CorelDraw 12打造休闲裤
Firework如何画特殊的切角图形
Firework打造韩式风格的手提袋
flash实例:打造佛光效果
>> 分页 首页 前页 后页 尾页 页次:2/21个记录/页 转到 页 共2个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

本文现有 3 条评论 暂时没有人参与评分


cloudgamer Publish at 2008-10-31 11:17:16
www.cnblogs.com/cloudgamer/archive/2008/10/20/1314766.html
试试我这个
SinNeR Publish at 2008-1-23 14:04:39
xihanet
你的设定不太对。是这样的。
我的测试程序downloadSimpleFile.html中。
FILEPATH是指要下载的文件的绝对路径。FILENAME是指文件显示的名字。
比如,要下载C盘根目录的test.txt文件,想让用户保存的时候显示的是welcome.txt
那么,在FILEPATH中填写C:\test.txt,在FILENAME中填写welcome.txt
这样弹出的保存框,保存的时候,名字默认为welcome.txt。

如果还有问题,请在经典论坛PM我,这里我很少看。
xihanet Publish at 2008-1-21 21:06:46
请问SinNeR,我在下载你的文件测试单文件下载时候,老是提示错误“4”路径不对,请问正确的路径应该比如是什么啊,我输入的是c:\\
您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
大师之路--Photoshop 完全解析
《超越CSS》新书上市
Don't Make Me Think 第2版
HTML与CSS入门经典(第7版)
《FLASH MX2004网站开发精粹》
《CSS入门经典》
《设计师谈网页设计思维》
作品集 更多内容

黑水笔手绘 Just&nbsp;for&nbsp;you I&amp;nbsp;SEESAY game Dawn 天山网6周年 阿黑与阿白 特福莱全球连锁机构