zoukankan      html  css  js  c++  java
  • 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件:
    Html代码  收藏代码
    1. <form id"uploadForm" action"http://localhost:8080/cfJAX_RS/rest/file/upload" method"post" enctype ="multipart/form-data">  
    2.      <h1 >测试通过Rest接口上传文件 </h1>  
    3.      <p >指定文件名: <input type ="text" name="filename" /></p>  
    4.      <p >上传文件: <input type ="file" name="file" /></p>  
    5.      <p >关键字1: <input type ="text" name="keyword" /></p>  
    6.      <p >关键字2: <input type ="text" name="keyword" /></p>  
    7.      <p >关键字3: <input type ="text" name="keyword" /></p>  
    8.      <input type ="submit" value="上传"/>  
    9. </form>  

     

    不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,这种时候我们都是使用Ajax的方式进行请求的:
    Js代码  收藏代码
    1. $.ajax({  
    2.      url : "http://localhost:8080/STS/rest/user",  
    3.      type : "POST",  
    4.      data : $( '#postForm').serialize(),  
    5.      success : function(data) {  
    6.           $( '#serverResponse').html(data);  
    7.      },  
    8.      error : function(data) {  
    9.           $( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);  
    10.      }  
    11. });  

     

    如上,通过$('#postForm').serialize()可以对form表单进行序列化,从而将form表单中的所有参数传递到服务端。
     
    但是上述方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的。
    不过如今主流浏览器都开始支持一个叫做FormData的对象,有了这个FormData,我们就可以轻松地使用Ajax方式进行文件上传了。

     

     

    关于FormData及其用法


    FormData是什么呢?我们来看看Mozilla上的介绍。
    XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件. 
     
    所有主流浏览器的较新版本都已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。
     
    参见:https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/FormData

     

     

    这里只展示一个通过from表单来初始化FormData的方式
    <form enctype="multipart/form-data" method="post" name="fileinfo">
    Js代码  收藏代码
    1. var oData = new FormData(document.forms.namedItem("fileinfo" ));  
    2. oData.append( "CustomField""This is some extra data" );  
    3. var oReq = new XMLHttpRequest();  
    4. oReq.open( "POST""stash.php" , true );  
    5. oReq.onload = function(oEvent) {  
    6.       if (oReq.status == 200) {  
    7.           oOutput.innerHTML = "Uploaded!" ;  
    8.      } else {  
    9.           oOutput.innerHTML = "Error " + oReq.status + " occurred uploading your file.<br />";  
    10.      }  
    11. };  
    12. oReq.send(oData);  

     

     
     
    使用FormData,进行Ajax请求并上传文件

    这里使用JQuery,但是老版本的JQuery比如1.2是不支持的,最好使用2.0或更新版本:
    Html代码  收藏代码
    1. <form id"uploadForm">  
    2.       <p >指定文件名: <input type="text" name="filename" value""/></p >  
    3.       <p >上传文件: <input type="file" name="file"/></ p>  
    4.       <input type="button" value="上传" onclick="doUpload()" />  
    5. </form>  

     

    Js代码  收藏代码
    1. function doUpload() {  
    2.      var formData = new FormData($( "#uploadForm" )[0]);  
    3.      $.ajax({  
    4.           url: 'http://localhost:8080/cfJAX_RS/rest/file/upload' ,  
    5.           type: 'POST',  
    6.           data: formData,  
    7.           async: false,  
    8.           cache: false,  
    9.           contentType: false,  
    10.           processData: false,  
    11.           success: function (returndata) {  
    12.               alert(returndata);  
    13.           },  
    14.           error: function (returndata) {  
    15.               alert(returndata);  
    16.           }  
    17.      });  
    18. }  

     

     

    原文出处:

    [1] yunzhu, 通过Ajax方式上传文件,使用FormData进行Ajax请求, http://yunzhu.iteye.com/blog/2177923

     

  • 相关阅读:
    BZOJ 3132: 上帝造题的七分钟 树状数组+差分
    PAT Advanced 1006 Sign In and Sign Out (25 分)
    PAT Advanced 1011 World Cup Betting (20 分)
    PAT Basic 1032 挖掘机技术哪家强 (20 分)
    PAT Basic 1028 人口普查 (20 分)
    PAT Basic 1004 成绩排名 (20 分)
    大数据数据库HBase(二)——搭建与JavaAPI
    PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
    PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
    PAT Basic 1041 考试座位号 (15 分)
  • 原文地址:https://www.cnblogs.com/ryelqy/p/10104110.html
Copyright © 2011-2022 走看看