zoukankan      html  css  js  c++  java
  • ajaxFileUpload 异步上传数据

      AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值。

      它的配置方式比较像jQuery的AJAX,使用比较方便

      语法:$.ajaxFileUpload([options])

      参数:

        1,url          上传处理程序地址。  
        2,fileElementId      需要上传的文件域的ID,即<input type="file">的ID。
        3,secureuri        是否启用安全提交,默认为false。 
        4,dataType        服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
        5,success         提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
        6,error         提交失败自动执行的处理函数。
        7,data          自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
        8, type           当要提交自定义参数时,这个参数要设置成post

     

      使用步骤:

      第一步:导入JQuery和ajaxFileUpload的js文件

    <script type="text/javascript" src="js/jquery-1.11.2.min.js"></script>
    <script type="text/javascript" src="js/ajaxfileupload.js"></script>

       第二步:HTML代码

        <div style="200px;">
                <p><img id="img" src="" alt="头像"/></p>
                <p><input type="file" id="file" name="file" onchange="imgPreview();"/></p>
                <p>账户:<input type="text" id="username"/></p>
                <p>密码:<input type="password" id="password"/></p>
                <p><input type="button" value="注册" onclick="register();"/></p>
        </div>

       第三步:JS代码

    /* 
            用户—注册
        */
        function register(){
            //获取账户
            var username = $('#username').val().trim();
            if(username==null || username==''){
                alert('账户为空!');
                return false;
            }
            //获取密码
            var password = $('#password').val().trim();
            if(password==null || password==''){
                alert('密码为空!');
                return false;
            }
            //获取文件
            var file = $('#file')[0].files[0];
            if(!file){
                alert('请上传头像文件!');
                return false;
            }
            
            $.ajaxFileUpload({
                "url": 'register.do',
                "secureuri": false,
                "fileElementId": "file",
                "data": {"username":username,"password":password},
                "dataType": "text",
                "success": function(result){
                    alert('注册成功!');
                },
                "error": function(result){
                    alert('注册失败!');
                }
            });
        }

       第四步:后端java处理(spring)

         在使用MultipartHttpServletReuqest和MultipartFile类时,要对spring进行配置。

       具体见:http://www.cnblogs.com/gangbalei/p/6077791.html

        @RequestMapping(value="/register.do")
        public void upload(HttpServletRequest request) throws IOException{
            //获取ajaxFileUpload上传时data中传递的数据
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            
    //      判断request是否属于MultipartHttpServletRequest对象
    //        if(request instanceof MultipartHttpServletRequest){
    //            MultipartHttpServletRequest    multipartRequest = (MultipartHttpServletRequest)request;
    //            MultipartFile mfile = multipartRequest.getFile("file");
    //        }
            
            //将request强转成MultipartHttpServletRequest对象
            MultipartHttpServletRequest    multipartRequest = (MultipartHttpServletRequest)request;
            //获取上传的文件
            MultipartFile mfile = multipartRequest.getFile("file");
            
            //设置文件存放的位置
            File dir = new File("F:/upload");
            //如果目录不存在,则创建一个该目录
            if(!dir.exists()){
                dir.mkdir();
            }
            //获取上传的文件名
            String fileName = mfile.getOriginalFilename();
            //获取请求的输入流
            InputStream in = mfile.getInputStream();
            //读取输入流的数据
            byte[] buf = new byte[1048576];
            int length = in.read(buf);
            //文件存放的完成路径
            String path = dir.getAbsolutePath()+"//"+fileName;
            //新建输出流
            FileOutputStream out = new FileOutputStream(path);
            //将数据写入输出流中
            out.write(buf, 0, length);
            //关闭输入输出流
            in.close();
            out.close();
        }

       注意:

       使用ajaxFileUpload上传文件时,有时需要带参数提交,网上有很多资料说使用data,但其实要使用data带参数是需要修改的,否则后台是获取不到的.

        ajaxFileUpload为了实现无刷新异步提交文件,构建 iframe 然后创建form表单 再将要上传的文件写上去再提交.但是原代码 却没有处理data.所以这块内容需要我们自己加上去.

        下面红色部分为修改ajaxFileUpload.js的三处地方:

        createUploadForm: function(id, fileElementId,data)
        {
            var formId = 'jUploadForm' + id;
            var fileId = 'jUploadFile' + id;
            var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');    
            var oldElement = $('#' + fileElementId);
            var newElement = $(oldElement).clone();
            $(oldElement).attr('id', fileId);
            $(oldElement).before(newElement);
            $(oldElement).appendTo(form);
            if (data) { 
                    for (var i in data) { 
                     $('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);
                    } 
            }
            //set attributes
            $(form).css('position', 'absolute');
            $(form).css('top', '-1200px');
            $(form).css('left', '-1200px');
            $(form).appendTo('body');        
            return form;
        },

       在ajaxFileUpload: function(s)的内容中

    var form = jQuery.createUploadForm(id, s.fileElementId,s.data);
  • 相关阅读:
    nyoj112-指数运算
    nyoj51-管闲事的小明
    nyoj29-求置转换问题
    nyoj24-素数 距离问题
    nyoj22-素数求和问题
    nyoj23-取石子(一)
    nyoj4-ASCII码排序
    nyoj169-素数
    并查集:CDOJ1593-老司机破阵 (假的并查集拆除)
    线段树: CDOJ1598-加帕里公园的friends(区间合并,单点更新)
  • 原文地址:https://www.cnblogs.com/gangbalei/p/6095146.html
Copyright © 2011-2022 走看看