实现文件上传和下载完整案例

来源:互联网 发布:超人软件倒闭 编辑:程序博客网 时间:2024/05/21 17:41

1、创建用于保存文件的JavaBean

创建该JavaBean用于保存文件的信息,以便在向数据库中保存数据时作为一个容器进行传递

package com.valuebean;import com.toolsbean.StringHandler;public class FileBean {    private int     id;    private String  saveName;               //文件保存到磁盘中用到的名称    private String  fileName;               //文件的真实名称    private String  fileType;               //文件类型    private int     fileSize;               //文件大小    private String  fileInfo;               //文件描述    private String  uptime;                 //上传时间    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }       public String getSaveName() {        return saveName;    }    public void setSaveName(String saveName) {        this.saveName = saveName;    }    public String getFileName() {        return fileName;    }    public void setFileName(String fileName) {        this.fileName = fileName;    }    public String getFileType() {        return fileType;    }    public void setFileType(String fileType) {        this.fileType = fileType;    }       public String getFileInfo() {        return fileInfo;    }    public String getFileInfoForShow() {        return StringHandler.changehtml(fileInfo);    }    public void setFileInfo(String fileInfo) {        this.fileInfo = fileInfo;    }    public int getFileSize() {        return fileSize;    }    public void setFileSize(int fileSize) {        this.fileSize = fileSize;    }    public String getUptime() {        return uptime;    }    public void setUptime(String uptime) {        this.uptime = uptime;    }   }

2、创建文件上传的主页面

该页面实现一个Form表单,并设置表单的 enctype=”multipart/form-data” method=”post”属性

<%@ page contentType="text/html;charset=gb2312"%><html>    <head>        <title>上传文件</title>        <link type="text/css" rel="stylesheet" href="css/style.css">    </head>    <body bgcolor="#E1E1E1">        <center>        <table border="1" bordercolor="#BFD3E1" bordercolorlight="#BFD3E1" bordercolordark="white" cellpadding="0" cellspacing="0" rules="cols">            <tr><td colspan="2"><img src="images/top.jpg" width="833"></td><tr>            <tr height="30" bgcolor="black">                <td colspan="2" style="text-indent:20">                    <a style="color:white" href="index.jsp">首页</a>&nbsp;&nbsp;&nbsp;&nbsp;                    <a style="color:white" href="downloadview">下载文件</a>                </td>            </tr>            <form action="upload" enctype="multipart/form-data" name="uploadform" method="post">            <tr>                <td width="22%" align="center" valign="top" bgcolor="#F7FAF6" style="padding-top:8">                    <div style="background:#177B6C;width:94%;height:25;color:white"><b>注意事项:</b></div>                                      ●文件长度最大允许为50兆!                </td>                <td valign="top" style="padding-left:30;padding-top:10" bgcolor="white">                    <img src="images/title.jpg"><br><br>                    文件路径1:<br>                    <input type="file" name="file1" size="60"><br>                    文件描述1:<br>                    <textarea rows="5" cols="69" name="fileinfo1"></textarea><br>                    <hr color="black">                    文件路径2:<br>                    <input type="file" name="file2" size="60"><br>                    文件描述2:<br>                    <textarea rows="5" cols="69" name="fileinfo2"></textarea><br>                    <input type="button" style="border:0;background:url(images/submit.jpg);width:74;height:21" value="" onclick="uploadform.submit()">                    <input type="reset" style="border:0;background:url(images/reset.jpg);width:74;height:21" value="">                    <br><br>                </td>            </tr>            </form>            <tr><td colspan="2"><img src="images/end.jpg" width="833"></td><tr>        </table>        </form>        </center>    </body></html>

3、创建MyFileServlet

该Servlet用来接收并处理文件上传与下载的请求,在该类的doPost()方法中将根据用户请求调用相应的方法处理请求。

package com.servlet;import java.io.IOException;import java.sql.SQLException;import java.util.Date;import java.util.List;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.dao.FileDao;import com.jspsmart.upload.File;import com.jspsmart.upload.Files;import com.jspsmart.upload.SmartUpload;import com.toolsbean.StringHandler;import com.valuebean.FileBean;public class MyFileServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        doPost(request, response);    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        String servletPath=request.getServletPath();        if("/upload".equals(servletPath))            upload(request,response);        else if("/downloadview".equals(servletPath))            downloadview(request,response);             else if("/downloadrun".equals(servletPath))            downloadrun(request,response);          }    private void upload(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        String message="";        long maxsize=1024*1024*20;          //设置允许上传文件的总长度为20兆        String filedir="/files/";           //设置存放文件的目录(该目录位于web应用根目录下)        int k=0;        try{                        SmartUpload myup=new SmartUpload();            myup.initialize(this,request,response);            myup.setTotalMaxFileSize(maxsize);                              //设置允许上传文件的总长度            myup.upload();                                                  //上传文件            Files files=myup.getFiles();                                    //获取所有的上传文件            int count=files.getCount();                                     //获取上传文件数量            Date date=new Date();                                           //获取当前时间            boolean mark=false;            FileDao fileDao=new FileDao();            for(int i=0;i<count;i++){                                       //逐个获取上传的文件                File file=files.getFile(i);                if(!file.isMissing()){                                  //如果有文件                    mark=true;                    int filesize=file.getSize();                    if(filesize==0)                        message+="<li>文件 <b><font color='red'>"+file.getFilePathName()+"</font></b> 的大小为0!本系统不允许上传0字节的文件!</li><br>";                    else{                        String filename=file.getFileName();         //获取上传文件的名称                        String filetype=file.getContentType().trim();                        String savename=StringHandler.getSerial(date,i)+"."+file.getFileExt();                        String fileinfo=myup.getRequest().getParameter("fileinfo"+(i+1));                        String uptime=StringHandler.timeTostr(date);                        FileBean filebean=new FileBean();                        filebean.setFileName(filename);                        filebean.setSaveName(savename);                        filebean.setFileType(filetype);                        filebean.setFileSize(filesize);                        filebean.setFileInfo(fileinfo);                        filebean.setUptime(uptime);                        k=fileDao.addFileInfo(filebean);                                        //保存文件信息到数据库中                        if(k<=0)                                                                //信息保存失败!                            message+="●文件 <b><font color='red'>"+file.getFilePathName()+"</font></b> 上传失败!<br>";                                                else{                            file.saveAs(filedir+savename,File.SAVEAS_VIRTUAL);          //保存文件到磁盘的指定目录下                            message+="●文件 <b><font color='red'>"+file.getFilePathName()+"</font></b> 上传成功!<br>";                        }                    }                                   }            }            if(!mark)                message="●请至少选择一个要上传的文件!<br>";                          fileDao.closed();        }catch(java.lang.SecurityException e1){            k=-1;            message="●上传的文件总大小不允许超过"+(maxsize/1024/1024)+"兆!<br>";            e1.printStackTrace();        }        catch(Exception e2){            k=-1;            message="●文件上传失败!<br>";            e2.printStackTrace();        }catch(java.lang.OutOfMemoryError e3){            k=-1;            message="●您上传的文件太大!<br>";            e3.printStackTrace();        }        if(k<=0)            message+="<a href='javascript:window.history.go(-1)'>>> 返回重试</a><br>";        else            message+="<a href='uploadfile.jsp'>>> 继续上传</a><br>";        message+="<a href='index.jsp'>>> 返回主页</a>";        request.setAttribute("message",message);                RequestDispatcher rd=request.getRequestDispatcher("/message.jsp");        rd.forward(request,response);    }

4、创建FileDao类

在MyFileServlet.java中,在获取文件信息并封装到一个FileBean类对象中后,调用了FileDao类的addFileInfo()方法将文件信息保存到了数据库中,FileDao类用来实现基于数据库的各种操作

package com.dao;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.toolsbean.DB;import com.toolsbean.StringHandler;import com.valuebean.FileBean;public class FileDao {    private DB mydb=null;    public FileDao(){        mydb=new DB();    }    public int addFileInfo(FileBean file){        int i=-1;               String sql="insert into tb_file values(?,?,?,?,?,?)";        Object[] params={file.getSaveName(),file.getFileName(),file.getFileType(),file.getFileSize(),file.getFileInfo(),file.getUptime()};        mydb.doPstm(sql, params);        try {            i=mydb.getCount();        } catch (SQLException e) {            i=-1;            e.printStackTrace();        }        return i;           }    public FileBean getFileSingle(String savename) throws SQLException{        FileBean single=null;        String sql="select * from tb_file where file_savename=?";        Object[] params={savename};        List list=getList(sql,params);        if(list!=null&&list.size()!=0)            single=(FileBean)list.get(0);        return single;    }    public void closed(){        mydb.closed();    }}

5、实现文件下载

在MyFileServlet中创建downloadview()方法,该方法将调用FileDao类中的getFileList()方法获取数据库中的所有文件并保存,然后转发到文件下载主页面进行列表显示。

downloadview():

private void downloadview(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        FileDao fileDao=new FileDao();        try {            List filelist = fileDao.getFileList();            request.setAttribute("filelist",filelist);        } catch (SQLException e) {            e.printStackTrace();        }        fileDao.closed();        RequestDispatcher rd=request.getRequestDispatcher("/downloadfile.jsp");        rd.forward(request,response);    }

getFileList():

public List getFileList() throws SQLException{        String sql="select * from tb_file order by file_savename desc";        List list=getList(sql,null);        return list;    }

getList():

private List getList(String sql,Object[] params) throws SQLException{        List list=null;        mydb.doPstm(sql, params);        ResultSet rs=mydb.getRs();        if(rs!=null){            list=new ArrayList();            while(rs.next()){                FileBean single=new FileBean();                single.setId(rs.getInt(1));                single.setSaveName(rs.getString(2));                single.setFileName(rs.getString(3));                single.setFileType(rs.getString(4));                single.setFileSize(rs.getInt(5));                single.setFileInfo(rs.getString(6));                single.setUptime(StringHandler.timeTostr(rs.getTimestamp(7)));                list.add(single);            }            rs.close();        }        return list;    }

在MyFileServlet中创建downloadrun()fangfa

在该方法中,首先获取请求中传递的要下载的文件名称,然后判断该文件是否存在数据库中,若存在,则调用jspSmartUpload组件实现文件下载

private void downloadrun(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        String filedir="/files/";        String downfilename=request.getParameter("downname");        FileBean file=null;        try{            FileDao fileDao=new FileDao();            file=fileDao.getFileSingle(downfilename);            fileDao.closed();            if(file!=null){                String filename=new String(file.getFileName().getBytes("gb2312"),"ISO-8859-1");                SmartUpload mydown=new SmartUpload();                mydown.initialize(getServletConfig(),request,response);                mydown.setContentDisposition(null);                mydown.downloadFile(filedir+downfilename,file.getFileType(),filename);            }        }catch(Exception e){            e.printStackTrace();            String message="× 下载失败!文件 <b><font color='red'>"+file.getFileName()+"</font></b> 不存在或已经被删除!<br>";            message+="<a href='javascript:window.history.go(-1)'>返回</a>";            request.setAttribute("message",message);            RequestDispatcher rd=request.getRequestDispatcher("/message.jsp");            rd.forward(request,response);        }    }}
0 0
原创粉丝点击