美文网首页
文件上传与下载(二)Smartupload 实现

文件上传与下载(二)Smartupload 实现

作者: 年少懵懂丶流年梦 | 来源:发表于2017-03-12 18:44 被阅读6300次

    前面用了Jsp+Servlet来实现,那么接其他的方式来实现。

    在日常的开发中,为了提高开发的效率,我们通常使用组件和框架来进行开发。

    一般使用FileUpload / Smartupload 组件,Struts2使用FileUpload实现。

    二、SmartUpload上传组件

    SmartUpload上传组件使用简单,可以轻松的实现上传文件类型的限制,也可以轻易的取得上传文件的名称、后缀、大小等。

    导入lib包

    上传单个文件
    要想进行上传,必须使用HTML中的file控件,且<form />必须使用enctype进行分装,表示将表单按照二进制的方式提交。即所有的操作表单此时不再是分别提交,而是将所有内容都按照二进制的方式提交。

    <form action="smartUploadServlet.do" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile" />
        <input type="submit" value="上传" />
    </form>
    

    SmartUploadServlet:

    public class SmartUploadServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置上传文件保存路径
            String filePath = getServletContext().getRealPath("/") + "upload";
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdir();
            }
            //实例化上传组件
            SmartUpload su = new SmartUpload();
            //初始化SmartUpload
            su.initialize(getServletConfig(), req, resp);
            //设置上传文件对象10M
            su.setMaxFileSize(1024*1024*10);
            //设置所有文件大小100M
            su.setTotalMaxFileSize(1024*1024*100);
            //设置允许上传文件类型
            su.setAllowedFilesList("txt,jpg,gif,png");
            String result = "上传成功!";
            try {
                //设置禁止上传文件类型
                su.setDeniedFilesList("rar,jsp,js");
                //上传文件
                su.upload();
                //保存文件
                su.save(filePath);
            } catch (Exception e) {
                result = "上传失败!";
                e.printStackTrace();
            }
            
            req.setAttribute("smartResult", result);
            req.getRequestDispatcher("index.jsp").forward(req, resp);
        }
        
    }
    

    配置web.xml

      <servlet>
        <servlet-name>SmartUploadServlet</servlet-name>
        <servlet-class>com.meng.servlet.SmartUploadServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>SmartUploadServlet</servlet-name>
        <url-pattern>/smartUploadServlet.do</url-pattern>
      </servlet-mapping>
    

    混合表单
    如果要上传文件,表单则必须封装。但是当一个表单使用了<code>enctype="multipart/form-data"</code>封装后,其他的非表单控件的内容就无法通过request内置对象取得,此时必须通过SmartUpload类中提供的getRequest()方法取得全部的请求参数。

    <form action="" method="post" enctype="multipart/form-data">
        <input type="text" name="name" />
        <input type="file" name="pic" />
        <input type="submit" value="上传" />
    </form>
    

    表单接收方:

    SmartUpload smart = new SmartUpload();
    smart.initialize(getServletConfig(), req, resp);    
    smart.upload();
    String name = smart.getRequest().getParameter("name"); //接收请求参数
    smart.save(filePath);
    

    现在是通过SmartUpload完成参数接收的,所以smart.getRequest()方法一定要在执行完upload()方法后才可以使用。

    为上传文件自动命名

    如果多个用户上传的文件名一样,则会发生覆盖的情况。为了解决这个问题,我们来为上传文件自动命名。

    自动命名可以采用如下格式:

    IP地址+时间戳+三位随机数

    定义取得IP时间戳的操作类:

    package com.meng.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Random;
    
    public class IPTimeStamp {
        // 定义SimpleDateFormat对象
        private SimpleDateFormat sdf = null;
        // 接收ip地址
        private String ip = null;
    
        public IPTimeStamp() {
    
        }
    
        public IPTimeStamp(String ip) {
            this.ip = ip;
        }
    
        /**
         * 获得IP+时间戳+三位随机数
         * 
         * @return
         */
        public String getIPTimeRand() {
            StringBuffer buffer = new StringBuffer();
            if (this.ip != null) {
                String[] s = this.ip.split("\\"); // 进行拆分操作
                for (int i = 0; i < s.length; i++) {
                    buffer.append(this.addZero(s[i], 3)); // 不够三维数字的要补零
                }
            }
            buffer.append(this.getTimeStamp());
            Random r = new Random();
            for (int i = 0; i < 3; i++) {
                buffer.append(r.nextInt(10));
            }
            return buffer.toString();
        }
    
        /**
         * 补0操作
         * 
         * @param str
         * @param len
         * @return
         */
        private String addZero(String str, int len) {
            StringBuffer s = new StringBuffer();
            s.append(str);
            while (s.length() < len) {
                s.insert(0, "0");
            }
            return s.toString();
        }
    
        /**
         * 取得当前系统时间
         * 
         * @return
         */
        public String getDate() {
            this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            return this.sdf.format(new Date());
        }
    
        /**
         * 取得时间戳
         * 
         * @return
         */
        public String getTimeStamp() {
            this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            return this.sdf.format(new Date());
        }
    }
    

    修改Servlet

        SmartUpload smart = new SmartUpload();
        smart.initialize(getServletConfig(), req, resp);    
        smart.upload();
        String name = smart.getRequest().getParameter("name");
        IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr());
        String ext = smart.getFiles().getFile(0).getFileExt();  //取得文件后缀
        String fileName = its.getIPTimeRand() + "." + ext;      //拼凑文件名称
        smart.getFiles().getFile(0).saveAs(getServletContext().getRealPath("/") + "upload" + java.io.File.separator + fileName);
    

    通过SmartUpload获得上传文件的信息

            //获取上传的文件
            com.jspsmart.upload.File tempFile = su.getFiles().getFile(0);
            //获取上传文件的表单当中的name值
            tempFile.getFieldName();
            //获取上传的文件名
            tempFile.getFileName();
            //获取上传文件的大小
            tempFile.getSize();
            //获取上传文件的后缀名
            tempFile.getFileExt();
            //获取上传文件的全名
            tempFile.getFilePathName();
    

    批量上传

    批量上传很简单,只需修改前台页面中的代码即可。

        <form action="smartUploadServlet.do" method="post" enctype="multipart/form-data">
            选择图片:<input type="file" id="myfile1" name="myfile1">
            <input type="file" id="myfile2" name="myfile2">
            <input type="file" id="myfile3" name="myfile3">
            <input type="submit" value="上传">${smartResult}
        </form>
    

    SmartUpload实现下载

    下载:<a href="smartDownloadServlet.do?filename=0.png">下载文件</a>
    

    SmartDownloadServlet

    public class SmartDownloadServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            
            String filename = req.getParameter("filename");
            
            SmartUpload su = new SmartUpload();
            su.initialize(getServletConfig(), req, resp);
            // 设置响应类型
            su.setContentDisposition(null);
            try {
                su.downloadFile("/upload/" + filename);
            } catch (SmartUploadException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    SmartUpload实现批量下载

    一般的操作方式为,将多个文件打包成一个压缩包文件进行下载

        <h2>SmartUpload批量下载</h2>
        <form action="batchDownloadServlet.do" method="post">
            <input type="checkbox" id="myfile2" name="filename" value="06.jpg">06.jpg
            <input type="checkbox" id="myfile2" name="filename" value="07.jpg">07.jpg
            <input type="checkbox" id="myfile3" name="filename" value="10.jpg">10.jpg
            <input type="submit" value="下载">
        </form>
    

    BatchDownloadServlet

    public class BatchDownloadServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("application/x-msdownload");
            resp.setHeader("Content-Dispositon", "attachment;filename=test.zip");
        
            String path = getServletContext().getRealPath("/") + "upload/";
            String[] filenames = req.getParameterValues("filename");
            ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream());
            for (String filename : filenames) {
                File file = new File(path + filename);
                zos.putNextEntry(new ZipEntry(filename));
                FileInputStream fis = new FileInputStream(file);
                byte[] b = new byte[1024];
                int n = 0;
                while ((n = fis.read(b)) != -1) {
                    zos.write(b, 0, n);
                }
                zos.flush();
                fis.close();
            }
            zos.setComment("描述信息");
            zos.flush();
            zos.close();
        }
    }
    
    

    web.xml

    <servlet>
        <servlet-name>BatchDownloadServlet</servlet-name>
        <servlet-class>com.meng.servlet.BatchDownloadServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>BatchDownloadServlet</servlet-name>
        <url-pattern>/batchDownloadServlet.do</url-pattern>
      </servlet-mapping>
    

    相关文章

      网友评论

          本文标题:文件上传与下载(二)Smartupload 实现

          本文链接:https://www.haomeiwen.com/subject/nrdzgttx.html