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

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>    
                    <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//逐个获取上传的文件
                File file=files.getFile(i);
                if(!file.isMissing()){                                  //如果有文件
                    mark=true;
                    int filesize=file.getSize();
                    if(filesize==0)
                        message+="
  • 文件 "+file.getFilePathName()+" 的大小为0!本系统不允许上传0字节的文件!

  • "
    ; 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+="●文件 "+file.getFilePathName()+" 上传失败!
    "; else{ file.saveAs(filedir+savename,File.SAVEAS_VIRTUAL); //保存文件到磁盘的指定目录下 message+="●文件 "+file.getFilePathName()+" 上传成功!
    "; } } } } if(!mark) message="●请至少选择一个要上传的文件!
    "
    ; fileDao.closed(); }catch(java.lang.SecurityException e1){ k=-1; message="●上传的文件总大小不允许超过"+(maxsize/1024/1024)+"兆!
    "
    ; e1.printStackTrace(); } catch(Exception e2){ k=-1; message="●文件上传失败!
    "
    ; e2.printStackTrace(); }catch(java.lang.OutOfMemoryError e3){ k=-1; message="●您上传的文件太大!
    "
    ; e3.printStackTrace(); } if(k<=0) message+=">> 返回重试
    "
    ; else message+=">> 继续上传
    "
    ; message+=">> 返回主页"; 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="× 下载失败!文件 "+file.getFileName()+" 不存在或已经被删除!
    "; message+="返回"; request.setAttribute("message",message); RequestDispatcher rd=request.getRequestDispatcher("/message.jsp"); rd.forward(request,response); } } }

    你可能感兴趣的:(编程语言-Java)