您好,欢迎访问一九零五行业门户网

使用jquery插件ajaxupload进行文件上传

这次给大家带来使用jquery插件ajaxupload进行文件上传,使用jquery插件ajaxupload进行文件上传的注意事项有哪些,下面就是实战案例,一起来看一下。
本文实例讲述了jquery插件ajaxupload实现文件上传操作代码。分享给大家供大家参考。具体如下:
运行效果截图如下:
图1 文件上传前
图2 文件上传后
具体代码如下:
1、创建页面并编写html
上传文档:
<p class="uploadfile">   <span id="doc"><input type="text" disabled="disabled" /></span>   <input type="hidden" id="hidfilename" />   <input type="button" id="btnuploadfile" value="上传" />   <input type="button" id="btndeletefile" value="删除" />  </p>
上传图片:
<p class="uploadimg">   <img id="imgshow" src="/images/nophoto.gif" />   <input type="hidden" id="hidimgname" />   <input type="button" id="btnuploadimg" value="上传" />   <input type="button" id="btndeleteimg" value="删除" />  </p>
2、引用ajaxupload.js文件
<script src="/js/common/ajaxupload.js" type="text/javascript"></script>
3、编写js脚本
window.onload = function() {   init(); //初始化  }    //初始化  function init() {   //初始化文档上传   var btnfile = document.getelementbyid(btnuploadfile);   var doc = document.getelementbyid(doc);   var hidfilename = document.getelementbyid(hidfilename);   document.getelementbyid(btndeletefile).onclick = function() { delfile(doc, hidfilename); };   g_ajxuploadfile(btnfile, doc, hidfilename);      //初始化图片上传   var btnimg = document.getelementbyid(btnuploadimg);   var img = document.getelementbyid(imgshow);   var hidimgname = document.getelementbyid(hidimgname);   document.getelementbyid(btndeleteimg).onclick = function() { delimg(img, hidimgname); };   g_ajxuploadimg(btnimg, img, hidimgname);  }      var g_ajxtempdir = /file/temp/;  //文档上传  function g_ajxuploadfile(btn, doc, hidput, action) {   var button = btn, interval;   new ajaxupload(button, {   action: ((action == null || action == undefined) ? '/common/uploadhandler.ashx?filetype=file' : action),    data: {},    name: 'myfile',    onsubmit: function(file, ext) {     if (!(ext && /^(rar|zip|pdf|pdfx|txt|csv|xls|xlsx|doc|docx|rar|zip|pdf|pdfx|txt|csv|xls|xlsx|doc|docx)$/.test(ext))) {      alert(您上传的文档格式不对,请重新选择!);      return false;     }    },    oncomplete: function(file, response) {     flagvalue = response;     if (flagvalue == 1) {      alert(您上传的文档格式不对,请重新选择!);     }     else if (flagvalue == 2) {      alert(您上传的文档大于2m,请重新选择!);     }     else if (flagvalue == 3) {      alert(文档上传失败!);     }     else {      hidput.value = response;      doc.innerhtml=<a href='" + g_ajxtempdir + response + "' target='_blank'> + response + </a>;     }    }   });  }  //图片上传  function g_ajxuploadimg(btn, img, hidput) {   var button = btn, interval;   new ajaxupload(button, {    action: '/common/uploadhandler.ashx?filetype=img',    data: {},    name: 'myfile',    onsubmit: function(file, ext) {     if (!(ext && /^(jpg|jpg|png|png|gif|gif)$/.test(ext))) {      alert(您上传的图片格式不对,请重新选择!);      return false;     }    },    oncomplete: function(file, response) {     flagvalue = response;     if (flagvalue == 1) {      alert(您上传的图片格式不对,请重新选择!);     }     else if (flagvalue == 2) {      alert(您上传的图片大于200k,请重新选择!);     }     else if (flagvalue == 3) {      alert(图片上传失败!);     }     else {      hidput.value = response;      img.src = g_ajxtempdir + response;     }    }   });  }    //删除文档  function delfile(doc, hidput) {   hidput.value = ;   doc.innerhtml = <input type=\"text\" disabled=\"disabled\" />;  }    //删除图片  function delimg(img, hidput) {   hidput.value = ;   img.src = /images/nophoto.gif;  }
4、创建/common/uploadhandler.ashx处理程序
<%@ webhandler language="c#" class="uploadhandler" %>    using system;  using system.web;  using system.text.regularexpressions;  using system.io;    public class uploadhandler : ihttphandler {   private string _filedir = ; //文件目录   /// <summary>   /// 处理上传文件(1:文件格式不正确、2:文件大小不正确、3:上传失败、文件名称:上传成功)   /// </summary>   /// <param name="context"></param>   public void processrequest (httpcontext context) {    _filedir = context.server.mappath(@/file/temp/);    try    {     string result = 3;     string filetype = context.request.querystring[filetype]; //获取上传文件类型     if (filetype == file)     {      result = uploadfile(context); //文档上传     }     else if (filetype == img)     {      result = uploadimg(context); //图片上传     }     context.response.write(result);    }    catch    {     context.response.write(3);//3文件上传失败    }   }      /// <summary>   /// 文档上传   /// </summary>   /// <param name="context"></param>   /// <returns></returns>   private string uploadfile(httpcontext context)   {    int cout = context.request.files.count;    if (cout > 0)    {     httppostedfile hpf = context.request.files[0];     if (hpf != null)     {      string fileext = path.getextension(hpf.filename).tolower();      //只能上传文件,过滤不可上传的文件类型      string filefilt = .rar|.zip|.pdf|.pdfx|.txt|.csv|.xls|.xlsx|.doc|.docx......;      if (filefilt.indexof(fileext) <= -1) { return "1"; } //判断文件大小 int length = hpf.contentlength; if (length > 2097152)      {       return 2;      }            random rd = new random();      datetime nowtime = datetime.now;      string newfilename = nowtime.year.tostring() + nowtime.month.tostring() + nowtime.day.tostring() + nowtime.hour.tostring() + nowtime.minute.tostring() + nowtime.second.tostring() + rd.next(1000, 1000000) + path.getextension(hpf.filename);      if (!directory.exists(_filedir))      {       directory.createdirectory(_filedir);      }      string filename = _filedir + newfilename;      hpf.saveas(filename);      return newfilename;     }      }    return 3;   }     /// <summary>   /// 图片上传   /// </summary>   /// <param name="context"></param>   /// <returns></returns>   private string uploadimg(httpcontext context)   {    int cout = context.request.files.count;    if (cout > 0)    {     httppostedfile hpf = context.request.files[0];     if (hpf != null)     {      string fileext = path.getextension(hpf.filename).tolower();      //只能上传文件,过滤不可上传的文件类型      string filefilt = .gif|.jpg|.php|.jsp|.jpeg|.png|......;      if (filefilt.indexof(fileext) <= -1) { return "1"; } //判断文件大小 int length = hpf.contentlength; if (length > 204800)      {       return 2;      }            random rd = new random();      datetime nowtime = datetime.now;      string newfilename = nowtime.year.tostring() + nowtime.month.tostring() + nowtime.day.tostring() + nowtime.hour.tostring() + nowtime.minute.tostring() + nowtime.second.tostring() + rd.next(1000, 1000000) + path.getextension(hpf.filename);      if (!directory.exists(_filedir))      {       directory.createdirectory(_filedir);      }      string filename = _filedir + newfilename;      hpf.saveas(filename);      return newfilename;     }      }    return 3;   }      #region ihttphandler 成员     public bool isreusable   {    get { throw new notimplementedexception(); }   }     #endregion  }
附件1:页面css样式
/*上传文件*/  .uploadfile{margin-bottom:10px;}  /*上传图片*/  .uploadimg{}  .uploadimg img{width:102px; height:64px; border:1px solid #cccccc; display: block;}
附件2:ajaxupload.js文件
/**   * ajax upload ( http://valums.com/ajax-upload/ )   * copyright (c) andris valums   * licensed under the mit license ( http://valums.com/mit-license/ )   * thanks to gary haran, david mark, corey burns and others for contributions   */  (function () {   /* global window */   /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */     /**    * wrapper for firebug's console.log    */     function log() {    if (typeof(console) != 'undefined' && typeof(console.log) == 'function') {     array.prototype.unshift.call(arguments, '[ajax upload]');     console.log(array.prototype.join.call(arguments, ' '));    }   }     /**    * attaches event to a dom element.    * @param {element} el    * @param type event name    * @param fn callback this refers to the passed element    */     function addevent(el, type, fn) {    if (el.addeventlistener) {     el.addeventlistener(type, fn, false);    } else if (el.attachevent) {     el.attachevent('on' + type, function () {      fn.call(el);     });    } else {     throw new error('not supported or dom not loaded');    }   }     /**    * attaches resize event to a window, limiting    * number of event fired. fires only when encounteres    * delay of 100 after series of events.    *    * some browsers fire event multiple times when resizing    * http://www.quirksmode.org/dom/events/resize.html    *    * @param fn callback this refers to the passed element    */     function addresizeevent(fn) {    var timeout;      addevent(window, 'resize', function () {     if (timeout) {      cleartimeout(timeout);     }     timeout = settimeout(fn, 100);    });   }     // needs more testing, will be rewriten for next version     // getoffset function copied from jquery lib (http://jquery.com/)   if (document.documentelement.getboundingclientrect) {    // get offset using getboundingclientrect    // http://ejohn.org/blog/getboundingclientrect-is-awesome/    var getoffset = function (el) {     var box = el.getboundingclientrect();     var doc = el.ownerdocument;     var body = doc.body;     var docelem = doc.documentelement; // for ie     var clienttop = docelem.clienttop || body.clienttop || 0;     var clientleft = docelem.clientleft || body.clientleft || 0;       // in internet explorer 7 getboundingclientrect property is treated as physical,     // while others are logical. make all logical, like in ie8.     var zoom = 1;     if (body.getboundingclientrect) {      var bound = body.getboundingclientrect();      zoom = (bound.right - bound.left) / body.clientwidth;     }       if (zoom > 1) {      clienttop = 0;      clientleft = 0;     }       var top = box.top / zoom + (window.pageyoffset || docelem && docelem.scrolltop / zoom || body.scrolltop / zoom) - clienttop,      left = box.left / zoom + (window.pagexoffset || docelem && docelem.scrollleft / zoom || body.scrollleft / zoom) - clientleft;       return {      top: top,      left: left     };    };   } else {    // get offset adding all offsets    var getoffset = function (el) {     var top = 0,      left = 0;     do {      top += el.offsettop || 0;      left += el.offsetleft || 0;      el = el.offsetparent;     } while (el);       return {      left: left,      top: top     };    };   }     /**    * returns left, top, right and bottom properties describing the border-box,    * in pixels, with the top-left relative to the body    * @param {element} el    * @return {object} contains left, top, right,bottom    */     function getbox(el) {    var left, right, top, bottom;    var offset = getoffset(el);    left = offset.left;    top = offset.top;      right = left + el.offsetwidth;    bottom = top + el.offsetheight;      return {     left: left,     right: right,     top: top,     bottom: bottom    };   }     /**    * helper that takes object literal    * and add all properties to element.style    * @param {element} el    * @param {object} styles    */     function addstyles(el, styles) {    for (var name in styles) {     if (styles.hasownproperty(name)) {      el.style[name] = styles[name];     }    }   }     /**    * function places an absolutely positioned    * element on top of the specified element    * copying position and dimentions.    * @param {element} from    * @param {element} to    */     function copylayout(from, to) {    var box = getbox(from);      addstyles(to, {     position: 'absolute',     left: box.left + 'px',     top: box.top + 'px',     width: from.offsetwidth + 'px',     height: from.offsetheight + 'px'    });   }     /**    * creates and returns element from html chunk    * uses innerhtml to create an element    */   var toelement = (function () {    var p = document.createelement('p');    return function (html) {     p.innerhtml = html;     var el = p.firstchild;     return p.removechild(el);    };   })();     /**    * function generates unique id    * @return unique id    */   var getuid = (function () {    var id = 0;    return function () {     return 'valumsajaxupload' + id++;    };   })();     /**    * get file name from path    * @param {string} file path to file    * @return filename    */     function filefrompath(file) {    return file.replace(/.*(\/|\\)/, );   }     /**    * get file extension lowercase    * @param {string} file name    * @return file extenstion    */     function getext(file) {    return (-1 !== file.indexof('.')) ? file.replace(/.*[.]/, '') : '';   }     function hasclass(el, name) {    var re = new regexp('\\b' + name + '\\b');    return re.test(el.classname);   }     function addclass(el, name) {    if (!hasclass(el, name)) {     el.classname += ' ' + name;    }   }     function removeclass(el, name) {    var re = new regexp('\\b' + name + '\\b');    el.classname = el.classname.replace(re, '');   }     function removenode(el) {    el.parentnode.removechild(el);   }     /**    * easy styling and uploading    * @constructor    * @param button an element you want convert to    * upload button. tested dimentions up to 500x500px    * @param {object} options see defaults below.    */   window.ajaxupload = function (button, options) {    this._settings = {     // location of the server-side upload script     action: 'upload.php',     // file upload name     name: 'userfile',     // additional data to send     data: {},     // submit file as soon as it's selected     autosubmit: true,     // the type of data that you're expecting back from the server.     // html and xml are detected automatically.     // only useful when you are using json data as a response.     // set to json in that case.     responsetype: false,     // class applied to button when mouse is hovered     hoverclass: 'hover',     // class applied to button when au is disabled     disabledclass: 'disabled',     // when user selects a file, useful with autosubmit disabled     // you can return false to cancel upload        onchange: function (file, extension) {},     // callback to fire before file is uploaded     // you can return false to cancel upload     onsubmit: function (file, extension) {},     // fired when file upload is completed     // warning! do not use false string as a response!     oncomplete: function (file, response) {}    };      // merge the users options with our defaults    for (var i in options) {     if (options.hasownproperty(i)) {      this._settings[i] = options[i];     }    }      // button isn't necessary a dom element    if (button.jquery) {     // jquery object was passed     button = button[0];    } else if (typeof button == string) {     if (/^#.*/.test(button)) {      // if jquery user passes #elementid don't break it          button = button.slice(1);     }       button = document.getelementbyid(button);    }      if (!button || button.nodetype !== 1) {     throw new error(please make sure that you're passing a valid element);    }      if (button.nodename.touppercase() == 'a') {     // disable link           addevent(button, 'click', function (e) {      if (e && e.preventdefault) {       e.preventdefault();      } else if (window.event) {       window.event.returnvalue = false;      }     });    }      // dom element    this._button = button;    // dom element        this._input = null;    // if disabled clicking on button won't do anything    this._disabled = false;      // if the button was disabled before refresh if will remain    // disabled in firefox, let's fix it    this.enable();      this._rerouteclicks();   };     // assigning methods to our class   ajaxupload.prototype = {    setdata: function (data) {     this._settings.data = data;    },    disable: function () {     addclass(this._button, this._settings.disabledclass);     this._disabled = true;       var nodename = this._button.nodename.touppercase();     if (nodename == 'input' || nodename == 'button') {      this._button.setattribute('disabled', 'disabled');     }       // hide input     if (this._input) {      // we use visibility instead of display to fix problem with safari 4      // the problem is that the value of input doesn't change if it      // has display none when user selects a file         this._input.parentnode.style.visibility = 'hidden';     }    },    enable: function () {     removeclass(this._button, this._settings.disabledclass);     this._button.removeattribute('disabled');     this._disabled = false;      },    /**     * creates invisible file input     * that will hover above the button     * <p><input type='file' /></p>     */    _createinput: function () {     var self = this;       var input = document.createelement(input);     input.setattribute('type', 'file');     input.setattribute('name', this._settings.name);       addstyles(input, {      'position': 'absolute',      // in opera only 'browse' button      // is clickable and it is located at      // the right side of the input      'right': 0,      'margin': 0,      'padding': 0,      'fontsize': '480px',      'cursor': 'pointer'     });       var p = document.createelement(p);     addstyles(p, {      'display': 'block',      'position': 'absolute',      'overflow': 'hidden',      'margin': 0,      'padding': 0,      'opacity': 0,      // make sure browse button is in the right side      // in internet explorer      'direction': 'ltr',      //max zindex supported by opera 9.0-9.2      'zindex': 2147483583     });       // make sure that element opacity exists.     // otherwise use ie filter        if (p.style.opacity !== 0) {      if (typeof(p.filters) == 'undefined') {       throw new error('opacity not supported by the browser');      }      p.style.filter = alpha(opacity=0);     }       addevent(input, 'change', function () {        if (!input || input.value === '') {       return;      }        // get filename from input, required          // as some browsers have path instead of it        var file = filefrompath(input.value);        if (false === self._settings.onchange.call(self, file, getext(file))) {       self._clearinput();       return;      }        // submit form when value is changed      if (self._settings.autosubmit) {       self.submit();      }     });       addevent(input, 'mouseover', function () {      addclass(self._button, self._settings.hoverclass);     });       addevent(input, 'mouseout', function () {      removeclass(self._button, self._settings.hoverclass);        // we use visibility instead of display to fix problem with safari 4      // the problem is that the value of input doesn't change if it      // has display none when user selects a file         input.parentnode.style.visibility = 'hidden';       });       p.appendchild(input);     document.body.appendchild(p);       this._input = input;    },    _clearinput: function () {     if (!this._input) {      return;     }       // this._input.value = ''; doesn't work in ie6             removenode(this._input.parentnode);     this._input = null;     this._createinput();       removeclass(this._button, this._settings.hoverclass);    },    /**     * function makes sure that when user clicks upload button,     * the this._input is clicked instead     */    _rerouteclicks: function () {     var self = this;       // ie will later display 'access denied' error     // if you use using self._input.click()     // other browsers just ignore click()       addevent(self._button, 'mouseover', function () {      if (self._disabled) {       return;      }        if (!self._input) {       self._createinput();      }        var p = self._input.parentnode;      copylayout(self._button, p);      p.style.visibility = 'visible';       });         // commented because we now hide input on mouseleave     /**      * when the window is resized the elements      * can be misaligned if button position depends      * on window size      */     //addresizeevent(function(){     // if (self._input){     //  copylayout(self._button, self._input.parentnode);     // }     //});         },    /**     * creates iframe with unique name     * @return {element} iframe     */    _createiframe: function () {     // we can't use gettime, because it sometimes return     // same value in safari :(     var id = getuid();       // we can't use following code as the name attribute     // won't be properly registered in ie6, and new window     // on form submit will open     // var iframe = document.createelement('iframe');     // iframe.setattribute('name', id);             var iframe = toelement('<iframe src="javascript:false;" name="' + id + '" />');     // src=javascript:false; was added     // because it possibly removes ie6 prompt     // this page contains both secure and nonsecure items     // anyway, it doesn't do any harm.        iframe.setattribute('id', id);       iframe.style.display = 'none';     document.body.appendchild(iframe);       return iframe;    },    /**     * creates form, that will be submitted to iframe     * @param {element} iframe where to submit     * @return {element} form     */    _createform: function (iframe) {     var settings = this._settings;       // we can't use the following code in ie6     // var form = document.createelement('form');     // form.setattribute('method', 'post');     // form.setattribute('enctype', 'multipart/form-data');     // because in this case file won't be attached to request          var form = toelement('<form method="post" enctype="multipart/form-data"></form>');       form.setattribute('action', settings.action);     form.setattribute('target', iframe.name);     form.style.display = 'none';     document.body.appendchild(form);       // create hidden input element for each data key     for (var prop in settings.data) {      if (settings.data.hasownproperty(prop)) {       var el = document.createelement(input);       el.setattribute('type', 'hidden');       el.setattribute('name', prop);       el.setattribute('value', settings.data[prop]);       form.appendchild(el);      }     }     return form;    },    /**     * gets response from iframe and fires oncomplete event when ready     * @param iframe     * @param file filename to use in oncomplete callback     */    _getresponse: function (iframe, file) {     // getting response     var todeleteflag = false,      self = this,      settings = this._settings;       addevent(iframe, 'load', function () {        if ( // for safari      iframe.src == javascript:'%3chtml%3e%3c/html%3e'; ||      // for ff, ie      iframe.src == javascript:'<html></html>';) {       // first time around, do not delete.       // we reload to blank page, so that reloading main page       // does not re-submit the post.         if (todeleteflag) {        // fix busy state in ff3        settimeout(function () {         removenode(iframe);        },        0);       }         return;      }        var doc = iframe.contentdocument ? iframe.contentdocument : window.frames[iframe.id].document;        // fixing opera 9.26,10.00      if (doc.readystate && doc.readystate != 'complete') {       // opera fires load event multiple times       // even when the dom is not ready yet       // this fix should not affect other browsers       return;      }        // fixing opera 9.64      if (doc.body && doc.body.innerhtml == false) {       // in opera 9.64 event was fired second time       // when body.innerhtml changed from false       // to server response approx. after 1 sec       return;      }        var response;        if (doc.xmldocument) {       // response is a xml document internet explorer property       response = doc.xmldocument;      } else if (doc.body) {       // response is html document or plain text       response = doc.body.innerhtml;         if (settings.responsetype && settings.responsetype.tolowercase() == 'json') {        // if the document was sent as 'application/javascript' or        // 'text/javascript', then the browser wraps the text in a <pre>        // tag and performs html encoding on the contents. in this case,        // we need to pull the original text content from the text node's        // nodevalue property to retrieve the unmangled content.        // note that ie6 only understands text/html        if (doc.body.firstchild && doc.body.firstchild.nodename.touppercase() == 'pre') {         response = doc.body.firstchild.firstchild.nodevalue;        }          if (response) {         response = eval(( + response + ));        } else {         response = {};        }       }      } else {       // response is a xml document       response = doc;      }        settings.oncomplete.call(self, file, response);        // reload blank page, so that reloading main page      // does not re-submit the post. also, remember to      // delete the frame      todeleteflag = true;        // fix ie mixed content issue      iframe.src = javascript:'<html></html>';;     });    },    /**     * upload file contained in this._input     */    submit: function () {     var self = this,      settings = this._settings;       if (!this._input || this._input.value === '') {      return;     }       var file = filefrompath(this._input.value);       // user returned false to cancel upload     if (false === settings.onsubmit.call(this, file, getext(file))) {      this._clearinput();      return;     }       // sending request      var iframe = this._createiframe();     var form = this._createform(iframe);       // assuming following structure     // p -> input type='file'     removenode(this._input.parentnode);     removeclass(self._button, self._settings.hoverclass);       form.appendchild(this._input);       form.submit();       // request set, clean up         removenode(form);     form = null;     removenode(this._input);     this._input = null;       // get response from iframe and fire oncomplete event when ready     this._getresponse(iframe, file);       // get ready for next request        this._createinput();    }   };  })();
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
jquery插件限制上传文件大小与格式使用方法
jquery插件tocify动态节点实现目录菜单
以上就是使用jquery插件ajaxupload进行文件上传的详细内容。
其它类似信息

推荐信息