• 由uploadfive看servlet


    一、uploadfive的使用

      上传工具是程序设计中最常用的功能,其中,uploadfive插件使用比较多,此处该插件进行文件的上传操作。该插件是基于HTML5的,因此PC端和移动端都可以使用。
    使用:
    1、下载uploadfive插件,解压缩到项目中;
    2、在程序中调用;
     
    HTML代码
    <div>        
            <input id="file_upload" type="file" name="file_upload" />
    </div>

    JS代码

    $('#file_upload').uploadifive({               
            'uploadScript' : '/PersonalSystem/upload' ,  //处理文件上传的服务器端脚本,可根据自己的项目环境修改
            //'auto':false,   //是否自动上传,默认true       
            //'fileObjName' : 'upload',   //服务器端获取的文件对象的名称
            'buttonText' : '上传照片',   //上传按钮文字
           // 'queueID' : 'tip-queue1',   //进度条的显示位置
           // 'fileType' : 'image/*',   //上传文件类型
            //'multi' : false,   //是否多文件上传
           // 'fileSizeLimit'   : 5242880,   //限制上传文件的大小
            //'uploadLimit' : 1,   //一次可以上传的最大文件数
            //'queueSizeLimit'  : 1,    //允许队列中存在的最大文件数
           // 'removeCompleted':false,   //隐藏完成上传的文件,默认为false
            'height':50, 
            'width':80,   //上传按钮的宽度与高度只能通过这两个属性进行修改      
            'onUploadComplete' : function(file, data) { 
                debugger//onUploadComplete:文件上传完成时触发; 回调参数 file:上传完的文件对象;data:服务器端(uplodify.php)返回的信息
                alert('图片' + file.name + '成功上传');
            }
        })

    其中,uploadScript属性是服务器端脚本,插件自带uploadfive.php脚本,在此基础上,创建servlet代替原有的PHP文件。  'uploadScript' : '/PersonalSystem/upload',是servlet的访问路径,在web.xml进行配置。

    二、为什么使用servlet

    首先要知道servlet是用Java编写的服务器端小程序,在程序中是 Java 编程语言中的一个类,在整个架构中是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它被用来扩展服务器的性能。其工作原理如图:

    三、servlet的使用

    创建servlet

    1、创建一个servlet的Java类(也可以直接创建servlet),创建Java类后,根据需要添加doGet()和doPost()等函数;
    2、配置web.xml 

     web.xml中的配置代码

    <servlet>
        <description>专门用来处理上传操作的servlet</description>
        <servlet-name>UploadServlet</servlet-name>
        <servlet-class>pers.mengb.persys.servlet.UploadServlet</servlet-class>   
    </servlet>
    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>

    其中servlet-name是servlet名,servlet-class是报名加servlet名,url-pattern为映射路径,可以随意起名字,设置成功后可以直接在系统URL后面加上该映射路径,即可访问该servlet。

    文件上传servlet

    首先下载两个jar包,分别为commons-fileupload-1.2.2-bin.zip  和 commons-io-2.3-bin.zip          
    将两个zip解压缩去除jar包放在lib文件夹下
    然后在servlet编写上传代码即可,注意文件上传的提交方式必须是post方式
    package pers.mengb.persys.servlet;
    import javax.servlet.http.*;
    import javax.servlet.*;
    import java.io.*;
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    import org.apache.commons.fileupload.FileItem;  
    import org.apache.commons.fileupload.FileUploadException;  
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
    import org.apache.commons.fileupload.servlet.ServletFileUpload;  
    public class UploadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /*          
             * @author Administrator
             * 文件上传
             * 具体步骤:
             * 1)获得磁盘文件条目工厂 DiskFileItemFactory (要导包)
             * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
             * 3)对 DiskFileItemFactory 对象设置一些 属性
             * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory);
             * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list ,
             *     
             * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理
             * 6)
             *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上
             *    第二种. 手动处理  
             *
             */
                request.setCharacterEncoding("utf-8");    //设置编码            
                DiskFileItemFactory factory = new DiskFileItemFactory();                 //获得磁盘文件条目工厂            
                String path = this.getServletContext().getRealPath("uploadDir");           //获取文件需要上传到的路径
                //String path = request.getRealPath("/upload");    //该方法不推荐使用啦
                    //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
                    //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
                    /*
                     * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 
                     * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 
                     * 然后再将其真正写到 对应目录的硬盘上
                     */
                    factory.setRepository(new File(path));                
                    factory.setSizeThreshold(1024*1024) ;                                //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室                                
                    ServletFileUpload upload = new ServletFileUpload(factory);           //高水平的API文件上传处理
                    try {                    
                        List<FileItem> list = upload.parseRequest(request);                    
                        for(FileItem item : list)
                        {
                            String name = item.getFieldName();                            //获取表单的属性名字                        
                            //如果获取的 表单信息是普通的 文本 信息
                            if(item.isFormField())
                            {                    
                                //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
                                String value = item.getString() ;
                                request.setAttribute(name, value);
                            }
                            //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
                            else
                            {
                                /*
                                 * 以下三步,主要获取 上传文件的名字
                                 */                            
                                String value = item.getName() ;           //获取路径名                            
                                int start = value.lastIndexOf("\");      //索引到最后一个反斜杠                            
                                String filename = value.substring(start+1);//截取 上传文件的 字符串名字,加1是 去掉反斜杠,
                                request.setAttribute(name, filename);                            
                                //真正写到磁盘上
                                //它抛出的异常 用exception 捕捉                            
                                //item.write( new File(path,filename) );//第三方提供的                           
                                //手动写的
                                OutputStream out = new FileOutputStream(new File(path,filename));                            
                                InputStream in = item.getInputStream() ;                            
                                int length = 0 ;
                                byte [] buf = new byte[1024] ;                            
                                System.out.println("获取上传文件的总共大小为:"+item.getSize()+"字节");
                                // in.read(buf) 每次读到的数据存放在   buf 数组中
                                while( (length = in.read(buf) ) != -1)
                                {
                                    //在   buf 数组中 取出数据 写到 (输出流)磁盘上
                                    out.write(buf, 0, length);                                
                                }                            
                                in.close();
                                out.close();
                            }
                        }                                                            
                    } catch (FileUploadException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    catch (Exception e) {
                        // TODO Auto-generated catch block
                        
                        //e.printStackTrace();
                    }                               
                    //request.getRequestDispatcher("filedemo.jsp").forward(request, response);                
                }
            
    }

    四、servlet扩展知识点

    Servlet是线程安全吗?

    uploadfive 使用强烈建议查看官网文档

     
  • 相关阅读:
    python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
    python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
    python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
    bootstrap源码里的function加上了+号
    php get set方法深入理解
    20160519
    NetStatusEvent info对象的状态或错误情况的属性
    php 代码大全
    常见HTTP状态(304,200等)
    php strtotime 和 date 日期操作
  • 原文地址:https://www.cnblogs.com/Dreamice/p/7341168.html
Copyright © 2020-2023  润新知