zoukankan      html  css  js  c++  java
  • ajax上传文件,并检查文件类型、检查文件大小

    1、使用ajaxfileupload.js的插件,但是对插件做了一处修改,才能够正常使用

      修改的部分如下:

     1  2     uploadHttpData: function (r, type) {
     3         var data = !type;
     4         data = type == "xml" || data ? r.responseXML : r.responseText;        // If the type is "script", eval it in global context
     5         if (type == "script")
     6             jQuery.globalEval(data);        // Get the JavaScript object, if JSON is used.
     7         if (type == "json"){//对json类型的返回结果,做截取处理
     8             var tempData = data.substring(data.indexOf(">"") + 2);
     9             data = tempData.replace(""</pre>", "");
    10         }
    11         if (type == "html")
    12             jQuery("<div>").html(data).evalScripts();
    13         return data;
    14     }

    2、检查文件大小,对于常用浏览器测试都是可以的...

    3、使用struts的action接收,两个参数:1)上传到文件imageFile;2)上传的本地文件路径imageFilePath

    4、ajaxfileupload.js源码在最后贴出来

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      5     <script src="jquery1.8/jquery-1.8.0.js" type="text/javascript"></script>
      6     <script src="ajaxfileupload.js"></script>
      7     <script type="text/javascript">
      8      
      9 /* 头像上传 */
     10 function ajaxfileupload() {
     11     var filepath = $("#imageFile").val();
     12     //检查是否为图片
     13     if(!isImage(filepath)){
     14         return false;
     15     }
     16     //检查文件大小,不能超过2M
     17     if(!checkFileSize(filepath)){
     18         return false;
     19     }
     20 
     21     $.ajaxFileUpload({
     22             url: 'stu/uploadimage',
     23             secureuri: false,           //一般设置为false
     24             type: 'post',
     25             data: {imageFileName: $("#imageFile").val()},
     26             dataType: 'json',
     27             fileElementId: "imageFile",
     28             success: function (data, status) {
     29                 if (data == "error") {
     30                     alert("上传失败,请重试");
     31                 } else {
     32                     //导航栏:头像
     33                     $("#header_student_image").attr("src", data);
     34                     alert("上传成功");
     35                 }
     36             },
     37             error: function (data, status, e)//服务器响应失败处理函数
     38             {
     39                 alert("上传失败,请重试");
     40             }
     41         }
     42     );
     43     return false;
     44 };
     45 
     46 /* 检查是否为图片 */
     47 function isImage(filepath) {
     48     var extStart = filepath.lastIndexOf(".");
     49     var ext = filepath.substring(extStart, filepath.length).toUpperCase();
     50     if (ext != ".BMP" && ext != ".PNG" && ext != ".GIF" && ext != ".JPG" && ext != ".JPEG") {
     51         alert("头像只能是bmp,png,gif,jpeg,jpg格式喔");
     52         return false;
     53     }
     54     return true;
     55 }
     56 
     57 /* 检查图片大小,不能超过3M,支持IE、filefox、chrome */
     58 function checkFileSize(filepath) {
     59     var maxsize = 2 * 1024 * 1024;//2M
     60     var errMsg = "上传的头像文件不能超过2M喔!!!";
     61     var tipMsg = "您的浏览器暂不支持上传头像,确保上传文件不要超过2M,建议使用IE、FireFox、Chrome浏览器。";
     62 
     63     try {
     64         var filesize = 0;
     65         var ua = window.navigator.userAgent;
     66         if (ua.indexOf("MSIE") >= 1) {
     67             //IE
     68             var img = new Image();
     69             img.src = filepath;
     70             filesize = img.fileSize;
     71         } else {
     72             //file_size = document.getElementById("imageFile").files[0].size;
     73             filesize = $("#imageFile")[0].files[0].size; //byte
     74         }
     75 
     76         if (filesize > 0 && filesize > maxsize) {
     77             alert(errMsg);
     78             return false;
     79         } else if (filesize == -1) {
     80             alert(tipMsg);
     81             return false;
     82         }
     83     } catch (e) {
     84         alert("头像上传失败,请重试");
     85         return false;
     86     }
     87     return true;
     88 }
     89     </script>
     90     <title>test:上传头像</title>
     91 </head>
     92 <body>
     93     <table width="500" cellspacing="0" cellpadding="0">
     94         <tr>
     95             <td width="72" id="fileType">
     96             </td>
     97             <td width="242">
     98                  <img id="image_url" src="" class="wetalkimg"/>
     99                  <input type="file" id="imageFile" name="imageFile" onchange="ajaxfileupload(this);"/>
    100              </td>
    101         </tr>
    102     </table>
    103 </body>
    104 </html

    5、ajaxfileupload.js源码

      1 jQuery.extend({
      2     createUploadIframe: function (id, uri) {//id为当前系统时间字符串,uri是外部传入的json对象的一个参数
      3         //create frame
      4         var frameId = 'jUploadFrame' + id; //给iframe添加一个独一无二的id
      5         var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"'; //创建iframe元素
      6         if (window.ActiveXObject) {//判断浏览器是否支持ActiveX控件
      7             if (typeof uri == 'boolean') {
      8                 iframeHtml += ' src="' + 'javascript:false' + '"';
      9             }            else if (typeof uri == 'string') {
     10                 iframeHtml += ' src="' + uri + '"';
     11             }
     12         }
     13         iframeHtml += ' />';
     14         jQuery(iframeHtml).appendTo(document.body); //将动态iframe追加到body中
     15         return jQuery('#' + frameId).get(0); //返回iframe对象
     16     },
     17     createUploadForm: function (id, fileElementId, data) {//id为当前系统时间字符串,fileElementId为页面<input type='file' />的id,data的值需要根据传入json的键来决定
     18         //create form
     19         var formId = 'jUploadForm' + id; //给form添加一个独一无二的id
     20         var fileId = 'jUploadFile' + id; //给<input type='file' />添加一个独一无二的id
     21         var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data" ></form>'); //创建form元素
     22         if (data) {//通常为false
     23             for (var i in data) {
     24                 jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form); //根据data的内容,创建隐藏域,这部分我还不知道是什么时候用到。估计是传入json的时候,如果默认传一些参数的话要用到。
     25             }
     26         }        var oldElement = jQuery('#' + fileElementId); //得到页面中的<input type='file' />对象
     27         var newElement = jQuery(oldElement).clone(); //克隆页面中的<input type='file' />对象
     28         jQuery(oldElement).attr('id', fileId); //修改原对象的id
     29         jQuery(oldElement).before(newElement); //在原对象前插入克隆对象
     30         jQuery(oldElement).appendTo(form); //把原对象插入到动态form的结尾处
     31         //set attributes
     32         jQuery(form).css('position', 'absolute'); //给动态form添加样式,使其浮动起来,
     33         jQuery(form).css('top', '-1200px');
     34         jQuery(form).css('left', '-1200px');
     35         jQuery(form).appendTo('body'); //把动态form插入到body中
     36         return form;
     37     },
     38     ajaxFileUpload: function (s) {//这里s是个json对象,传入一些ajax的参数
     39         // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
     40         s = jQuery.extend({}, jQuery.ajaxSettings, s); //此时的s对象是由jQuery.ajaxSettings和原s对象扩展后的对象
     41         var id = new Date().getTime(); //取当前系统时间,目的是得到一个独一无二的数字
     42         var form = jQuery.createUploadForm(id, s.fileElementId, (typeof (s.data) == 'undefined' ? false : s.data)); //创建动态form
     43         var io = jQuery.createUploadIframe(id, s.secureuri); //创建动态iframe
     44         var frameId = 'jUploadFrame' + id; //动态iframe的id
     45         var formId = 'jUploadForm' + id; //动态form的id
     46         // Watch for a new set of requests
     47         if (s.global && !jQuery.active++) {//当jQuery开始一个ajax请求时发生
     48             jQuery.event.trigger("ajaxStart"); //触发ajaxStart方法
     49         }        var requestDone = false; //请求完成标志
     50         // Create the request object
     51         var xml = {};        if (s.global)
     52             jQuery.event.trigger("ajaxSend", [xml, s]); //触发ajaxSend方法
     53         // Wait for a response to come back
     54         var uploadCallback = function (isTimeout) {//回调函数
     55             var io = document.getElementById(frameId); //得到iframe对象
     56             try {                if (io.contentWindow) {//动态iframe所在窗口对象是否存在
     57                 xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
     58                 xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;
     59             } else if (io.contentDocument) {//动态iframe的文档对象是否存在
     60                 xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
     61                 xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
     62             }
     63             } catch (e) {
     64                 jQuery.handleError(s, xml, null, e);
     65             }            if (xml || isTimeout == "timeout") {//xml变量被赋值或者isTimeout == "timeout"都表示请求发出,并且有响应
     66                 requestDone = true; //请求完成
     67                 var status;                try {
     68                     status = isTimeout != "timeout" ? "success" : "error"; //如果不是“超时”,表示请求成功
     69                     // Make sure that the request was successful or notmodified
     70                     if (status != "error") {                        // process the data (runs the xml through httpData regardless of callback)
     71                         var data = jQuery.uploadHttpData(xml, s.dataType); //根据传送的type类型,返回json对象,此时返回的data就是后台操作后的返回结果
     72                         // If a local callback was specified, fire it and pass it the data
     73                         if (s.success)
     74                             s.success(data, status); //执行上传成功的操作
     75                         // Fire the global callback
     76                         if (s.global)
     77                             jQuery.event.trigger("ajaxSuccess", [xml, s]);
     78                     } else
     79                         jQuery.handleError(s, xml, status);
     80                 } catch (e) {
     81                     status = "error";
     82                     jQuery.handleError(s, xml, status, e);
     83                 }                // The request was completed
     84                 if (s.global)
     85                     jQuery.event.trigger("ajaxComplete", [xml, s]);                // Handle the global AJAX counter
     86                 if (s.global && ! --jQuery.active)
     87                     jQuery.event.trigger("ajaxStop");                // Process result
     88                 if (s.complete)
     89                     s.complete(xml, status);
     90                 jQuery(io).unbind();//移除iframe的事件处理程序
     91                 setTimeout(function () {//设置超时时间
     92                     try {
     93                         jQuery(io).remove();//移除动态iframe
     94                         jQuery(form).remove();//移除动态form
     95                     } catch (e) {
     96                         jQuery.handleError(s, xml, null, e);
     97                     }
     98                 }, 100)
     99                 xml = null
    100             }
    101         }        // Timeout checker
    102         if (s.timeout > 0) {//超时检测
    103             setTimeout(function () {                // Check to see if the request is still happening
    104                 if (!requestDone) uploadCallback("timeout");//如果请求仍未完成,就发送超时信号
    105             }, s.timeout);
    106         }        try {            var form = jQuery('#' + formId);
    107             jQuery(form).attr('action', s.url);//传入的ajax页面导向url
    108             jQuery(form).attr('method', 'POST');//设置提交表单方式
    109             jQuery(form).attr('target', frameId);//返回的目标iframe,就是创建的动态iframe
    110             if (form.encoding) {//选择编码方式
    111                 jQuery(form).attr('encoding', 'multipart/form-data');
    112             }            else {
    113                 jQuery(form).attr('enctype', 'multipart/form-data');
    114             }
    115             jQuery(form).submit();//提交form表单
    116         } catch (e) {
    117             jQuery.handleError(s, xml, null, e);
    118         }
    119         jQuery('#' + frameId).load(uploadCallback); //ajax 请求从服务器加载数据,同时传入回调函数
    120         return { abort: function () { } };
    121     },
    122     uploadHttpData: function (r, type) {
    123         var data = !type;
    124         data = type == "xml" || data ? r.responseXML : r.responseText;        // If the type is "script", eval it in global context
    125         if (type == "script")
    126             jQuery.globalEval(data);        // Get the JavaScript object, if JSON is used.
    127         if (type == "json"){//修改之处
    128             var tempData = data.substring(data.indexOf(">"") + 2);
    129             data = tempData.replace(""</pre>", "");
    130         }
    131         if (type == "html")
    132             jQuery("<div>").html(data).evalScripts();
    133         return data;
    134     },
    135     handleError: function (s, xhr, status, e) {
    136         if (s.error) {
    137             s.error.call(s.context || s, xhr, status, e);
    138         }
    139         if (s.global) {
    140             (s.context ? jQuery(s.context) : jQuery.event).trigger("ajaxError", [xhr, s, e]);
    141         }
    142     }
    143 })
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/yingsong/p/5537999.html
Copyright © 2011-2022 走看看