zoukankan      html  css  js  c++  java
  • JAVA-使用commos-fileupload实现文件上传与下载

    一文件的上传

    实体类

     在CODE上查看代码片派生到我的代码片
    import java.sql.Timestamp;  
      
    /** 
     *  
     * @Decription 文件上传实体类 
     * @author 刘楠 
     *  
     * @time2016-1-31上午11:17:46 
     */  
    public class Upfile {  
      
        private String id;// ID主键 使用uuid随机生成  
        private String uuidname; // UUID名称  
        private String filename;//文件名称  
        private String savepath; // 保存路径  
        private Timestamp uploadtime; // 上传时间  
        private String description;// 文件描述  
        private String username; // 用户名  
      
        public Upfile() {  
            super();  
        }  
      
          
      
        public Upfile(String id, String uuidname, String filename, String savepath,  
                Timestamp uploadtime, String description, String username) {  
            super();  
            this.id = id;  
            this.uuidname = uuidname;  
            this.filename = filename;  
            this.savepath = savepath;  
            this.uploadtime = uploadtime;  
            this.description = description;  
            this.username = username;  
        }  
      
      
      
        public String getDescription() {  
            return description;  
        }  
      
      
      
        public String getFilename() {  
            return filename;  
        }  
      
      
      
        public String getId() {  
            return id;  
        }  
      
        public String getSavepath() {  
            return savepath;  
        }  
      
        public Timestamp getUploadtime() {  
            return uploadtime;  
        }  
      
        public String getUsername() {  
            return username;  
        }  
      
        public String getUuidname() {  
            return uuidname;  
        }  
      
        public void setDescription(String description) {  
            this.description = description;  
        }  
      
        public void setFilename(String filename) {  
            this.filename = filename;  
        }  
      
        public void setId(String id) {  
            this.id = id;  
        }  
      
        public void setSavepath(String savepath) {  
            this.savepath = savepath;  
        }  
      
        public void setUploadtime(Timestamp uploadtime) {  
            this.uploadtime = uploadtime;  
        }  
      
        public void setUsername(String username) {  
            this.username = username;  
        }  
      
        public void setUuidname(String uuidname) {  
            this.uuidname = uuidname;  
        }  
      
    }  

    页面

     
     在CODE上查看代码片派生到我的代码片
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %>  
      
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
      <head>  
        <base href="<%=basePath%>">  
          
        <title>My JSP 'upload.jsp' starting page</title>  
          
        <meta http-equiv="pragma" content="no-cache">  
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
        <meta http-equiv="description" content="This is my page">  
        <!-- 
        <link rel="stylesheet" type="text/css" href="styles.css"> 
        -->  
      
      </head>  
        
      <body>  
        <h1>文件上传</h1>  
        <form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">  
       <table>  
       <tr>  
       <td> 上传用户名:</td>  
       <td><input type="text" name="username"/></td>  
       </tr>  
       <tr>  
       <td> 上传文件:</td>  
       <td><input type="file" name="file"/></td>  
       </tr>  
       <tr>  
       <td> 描述:</td>  
       <td><textarea rows="5" cols="50" name="description"></textarea></td>  
       </tr>  
        <tr>  
       <td><input type="submit" value="上传开始"/></td>  
       </tr>  
       </table>  
        </form>  
        <div>${msg }</div>  
        <a href="${pageContext.request.contextPath  }/index.jsp">返回主页</a>  
      </body>  
    </html>  


    Servlet

    在CODE上查看代码片派生到我的代码片
    import java.io.IOException;  
      
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;  
    import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;  
    import org.apache.commons.fileupload.servlet.ServletFileUpload;  
      
    import com.itheima.domain.Upfile;  
    import com.itheima.exception.MyException;  
    import com.itheima.service.UpfileService;  
    import com.itheima.service.impl.UpfileServiceImpl;  
    import com.itheima.untils.WebUntil;  
      
    public class UploadFileServlet extends HttpServlet {  
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
            doPost(request, response);  
        }  
      
        public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            //判断表单是不是多个部分组成的  
            if(!ServletFileUpload.isMultipartContent(request)){  
                  
                request.setAttribute("msg", "表单个设置错误,请检查enctype属性是是否设置正确");  
                request.getRequestDispatcher("/upload.jsp").forward(request, response);  
                return ;  
            }  
            //是多部分组成的就获取并遍历返回一个文件上传对象,包含上传的所有信息  
            try {  
                Upfile upfile=WebUntil.upload(request);  
                  
                UpfileService upfileService=new UpfileServiceImpl();  
                boolean flag=upfileService.add(upfile);  
                  
                if(flag){  
                    request.setAttribute("msg", "上传成功");  
                    request.getRequestDispatcher("/upload.jsp").forward(request, response);  
                    return ;  
                }else{  
                    request.setAttribute("msg", "上传失败,请重试");  
                    request.getRequestDispatcher("/upload.jsp").forward(request, response);  
                    return ;  
                }  
                  
            }catch (FileSizeLimitExceededException e) {  
                e.printStackTrace();  
                request.setAttribute("msg", "单个文件大小 ,超过最大限制");  
                request.getRequestDispatcher("/upload.jsp").forward(request, response);  
                return ;  
            } catch (SizeLimitExceededException e) {  
                e.printStackTrace();  
                request.setAttribute("msg", "总文件大小 ,超过最大限制");  
                request.getRequestDispatcher("/upload.jsp").forward(request, response);  
                return ;  
            }  
              
        }  
      
    } 



    工具类

    在CODE上查看代码片派生到我的代码片
    import java.io.File;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.io.UnsupportedEncodingException;  
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.UUID;  
      
    import javax.servlet.http.HttpServletRequest;  
      
    import org.apache.commons.fileupload.FileItem;  
    import org.apache.commons.fileupload.FileUploadBase;  
    import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;  
    import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;  
    import org.apache.commons.fileupload.FileUploadException;  
    import org.apache.commons.fileupload.ProgressListener;  
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
    import org.apache.commons.fileupload.servlet.ServletFileUpload;  
      
      
    import com.itheima.domain.Upfile;  
    import com.itheima.exception.MyException;  
    /** 
     * 文件上传工具类 
    * @Decription TODO 
     * @author 刘楠 
     * 
     * @time2016-1-31下午12:56:02 
     */  
    public class WebUntil {  
      
        /** 
         * 文件上传的方法 
         * @param request  请求参数传入 
         * @return  返回一个Upfile对象 
         * @throws FileSizeLimitExceededException  
         * @throws SizeLimitExceededException  
         * @throws IOException  
         */  
        public static Upfile upload(HttpServletRequest request) throws FileSizeLimitExceededException, SizeLimitExceededException {  
            Upfile upfile=new Upfile();  
            ArrayList<String> fileList=initList();  
            try {  
            //获取磁盘文件对象工厂  
            DiskFileItemFactory factory=new DiskFileItemFactory();  
            String tmp=request.getSession().getServletContext().getRealPath("/tmp");  
            System.out.println(tmp);  
            //初始化工厂  
            setFactory(factory,tmp);  
            //获取文件上传解析器  
            ServletFileUpload upload=new ServletFileUpload(factory);  
            //初始化解析器  
            setUpload(upload);  
            //获取文件列表集合  
                List<FileItem> list = upload.parseRequest(request);  
                //遍历  
                for (FileItem items : list) {  
                    //判断 是不是普通表单个对象  
                    if(items.isFormField()){  
                        //获取上传表单的name  
                        String fieldName=items.getFieldName();  
                        //value  
                        String fieldValue=items.getString("UTF-8");  
                        //判断  
                        if("username".equals(fieldName)){  
                            //设置  
                              
                            upfile.setUsername(fieldValue);  
                        }else if("description".equals(fieldName)){  
                            //设置属性  
                            upfile.setDescription(fieldValue);  
                        }  
                          
                    }else{  
                        //是文件就准备上传  
                        //获取文件名  
                        String filename=items.getName();  
                        //处理因为浏览器不同而导致的 获得 的  文件名的 差异  
                        int index=filename.lastIndexOf("\");  
                        if(index!=-1){  
                            filename=filename.substring(index+1);  
                        }  
                  
                      
                          
                        //生成随机的文件名  
                          
                        String uuidname=generateFilename(filename);  
                          
                        //获取上传的文件路径  
                        String savepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");  
                        //获取请求对象中的输入流  
                        InputStream in = items.getInputStream();  
                        //将文件打散存放在不同的路径,求出路径  
                        savepath=generateRandomDir(savepath,uuidname);  
                          
                        //复制文件  
                          
                        uploadFile(in,savepath,uuidname);  
                        String id=UUID.randomUUID().toString();  
                        upfile.setId(id);  
                        upfile.setSavepath(savepath);  
                        upfile.setUuidname(uuidname);  
                        upfile.setFilename(filename);  
                        //清除缓存  
                        items.delete();  
                    }  
                      
                      
                }  
                  
            }catch ( FileUploadBase.FileSizeLimitExceededException e) {  
                //抛出出异常  
                throw e;  
            } catch (FileUploadBase.SizeLimitExceededException e) {  
                //抛出出异常  
                throw e;  
            }catch (FileUploadException e) {  
                e.printStackTrace();  
            } catch (UnsupportedEncodingException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
              
              
              
            return upfile;  
        }  
      
      
      
        /** 
         * 初始化文件列表 
         * @return 
         */  
        private static ArrayList<String> initList() {  
             ArrayList<String>   list=new ArrayList<String>();  
               list.add(".jpg");  
               list.add(".rar");  
               list.add(".txt");  
               list.add(".png");  
                 
                 
               return  list;  
        }  
      
        /** 
         * 复制文件 
         * @param in items中的输入流 
         * @param savepath 保存路径 
         * @param uuidname 文件名 
         */  
        private static void uploadFile(InputStream in, String savepath,  
                String uuidname) {  
            //获取文件  
            File file=new File(savepath, uuidname);  
            OutputStream out = null;  
            try {  
                int len=0;  
                byte [] buf=new byte[1024];  
            //获取输出流  
                out = new FileOutputStream(file);  
                while((len=in.read(buf))!=-1){  
                    out.write(buf, 0, len);  
                }  
                  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{  
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                try {  
                    out.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
              
        }  
      
      
        /** 
         * 生成随机的存放路径 
         * @param savepath 保存路径 
         * @param uuidname  生成的uuid名称 
         * @return 
         * 使用hashcode完成 
         */  
        private static String generateRandomDir(String savepath, String uuidname) {  
            //转化为hashcode  
            System.out.println("上传路径"+savepath);  
            System.out.println("UUIDNAME"+uuidname);  
            int hashcode=uuidname.hashCode();  
            //容器  
            StringBuilder sb=new StringBuilder();  
            while(hashcode>0){  
                //与上15  
                int tmp=hashcode&0xf;  
                  
                sb.append("/");  
                sb.append(tmp+"");  
                hashcode=hashcode>>4;  
            }  
            //拼接新的路径  
            String path=savepath+sb.toString();  
            System.out.println("path"+path);  
            File file=new File(path);  
            //判断路径存不存在  
            if(!file.exists()){  
                //不存在就创建  
                file.mkdirs();  
            }  
      
            //返回保存路径   
            return path;  
        }  
      
      
        /** 
         * 生成新的文件名 
         * @param uuidname 随机的ID名字 
         * @param filename 原来的名 
         * @return 
         */  
        private static String generateFilename( String filename) {  
            String uuidname=UUID.randomUUID().toString();  
            return uuidname.replace("-", "").toString()+"_"+filename;  
        }  
      
        /** 
         * 初始化解析器 
         * @param upload 
         */  
        private static void setUpload(ServletFileUpload upload) {  
            // 设置 字符编码  
            upload.setHeaderEncoding("utf-8");  
            //设置文件大小  
            upload.setFileSizeMax(1024*1024*20);  
            //设置总文件大小  
            upload.setSizeMax(1024*1024*50);  
            //设置进度监听器  
            upload.setProgressListener(new ProgressListener() {  
                  
                public void update(long pBytesRead, long pContentLength, int pItems) {  
                    System.out.println("已经读取:  "+pBytesRead+",总共有: "+pContentLength+", 第"+pItems+"个");  
                      
                }  
            });   
              
        }  
      
        /** 
         * 工厂初始化方法 
         * @param factory 
         * @param tmp  缓冲目录 
         */  
        private static void setFactory(DiskFileItemFactory factory, String tmp) {  
            /// 配置初始化值缓冲区  
            factory.setSizeThreshold(1024*1024);  
            File file=new File(tmp);  
            //设置缓冲目录  
            factory.setRepository(file);  
              
              
        }  
      
    }  
     

    二文件下载

    Servlet

    public class DownupfileServlet extends HttpServlet {  
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
            doPost(request, response);  
        }  
      
        public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            //获取ID  
            String id=request.getParameter("id");  
            //业务层的接口  
            UpfileService upfileService=new UpfileServiceImpl();  
            //根据ID查找这个对象  
            Upfile upfile=upfileService.findUpfileById(id);  
            if(upfile==null){  
                return;  
            }  
            //获取文件的真实名称  
            String filename=upfile.getFilename();  
            //如果文件名中有中文,需要转码,不然就下载时没有文件名  
            filename=URLEncoder.encode(filename, "utf-8");  
            //更改过的名称  
            String uuidname=upfile.getUuidname();  
            //保存路径  
            String savepath=upfile.getSavepath();  
            File file=new File(savepath,uuidname);  
            //判断文件 是否存在  
            if(!file.exists()){  
                request.setAttribute("msg", "下载 的文件过期了");  
                request.getRequestDispatcher("/index").forward(request, response);  
                return;  
            }  
            //设置文件下载响应头信息  
            response.setHeader("Content-disposition", "attachement;filename="+filename);  
            //使用IO流输出  
            InputStream in = new FileInputStream(file);  
            ServletOutputStream out = response.getOutputStream();  
            int len=0;  
            byte [] buf=new byte[1024];  
            while((len=in.read(buf))!=-1){  
                out.write(buf, 0, len);  
            }  
            in.close();  
              
        }  
      
    }  
     

    数据库

    create database upload_download_exercise;  
    use upload_download_exercise;  
    create table upfiles(  
       id varchar(100), //使用UUID生成  
       uuidname varchar(255),//uuid加上原来的文件名  
       filename varchar(100),//真实文件名  
       savepath varchar(255),//保存路径  
       uploadtime timestamp,//上传时间  
       description varchar(255),//描述  
       username varchar(10) 上传人  
    );  
     
  • 相关阅读:
    如何在Ubuntu Unity上修改应用程序图标
    Ubuntu添加PPA源
    Ubuntu14.04下Unity桌面托盘图标显示问题
    apt-get用法
    解决ubuntu无法调整和保存屏幕亮度的问题
    终端调测命令易用性的改进
    关于Linux系统basename函数缺陷的思考
    基于VLAN的二三层转发
    【译】编写可重入和线程安全的代码
    Writing Reentrant and Thread-Safe Code(译:编写可重入和线程安全的代码)
  • 原文地址:https://www.cnblogs.com/liunanjava/p/5175145.html
Copyright © 2011-2022 走看看