zoukankan      html  css  js  c++  java
  • 170531、FormData 对象的使用

    通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit() 方法传输的数据格式相同

    1、如何创建一个FormData对象EDIT

    你可以自己创建一个FormData对象,然后通过调用它的append()方法添加字段,就像这样:
    
    var formData = new FormData();
    formData.append("username", "Groucho");
    // 数字 123456 会被立即转换成字符串 "123456"
    formData.append("accountnum", 123456);
    // HTML 文件类型input,由用户选择
    formData.append("userfile", fileInputElement.files[0]);
    // JavaScript file-like 对象
    var content = '<a id="a"><b id="b">hey!</b></a>';
    // 新文件的正文...
    var blob = new Blob([content], { type: "text/xml"});
    formData.append("webmasterfile", blob);
    var request = new XMLHttpRequest();
    request.open("POST", "http://foo.com/submitform.php");
    request.send(formData);
    
    注意:字段 "userfile" 和 "webmasterfile"  都包含一个文件. 字段 "accountnum" 是数字类型,它将被FormData.append()方法转换成字符串类型(FormData 对象的字段类型可以是 Blob, File, 
    或者 string: 如果它的字段类型不是Blob也不是File,则会被转换成字符串类型。 上面的示例创建了一个FormData实例,包含
    "username", "accountnum", "userfile" 和 "webmasterfile"四个字段,然后使用XMLHttpRequest的send()方法发送表单数据。
    字段 "webmasterfile" 是 Blob类型。一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。
    File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。你可以通过 Blob() 构造函数创建一个Blob对象。

    2、通过HTML表单创建FormData对象EDIT

    想要构造一个包含Form表单数据的FormData对象,需要在创建FormData对象时指定表单的元素。
    var formData = new FormData(someFormElement);
    示例:
    var formElement = document.querySelector("form");
    var request = new XMLHttpRequest();
    request.open("POST", "submitform.php");
    request.send(new FormData(formElement));
    
    你还可以在创建一个包含Form表单数据的FormData对象之后和发送请求之前,附加额外的数据到FormData对象里,像这样:
    
    var formElement = document.querySelector("form");
    var formData = new FormData(formElement);
    var request = new XMLHttpRequest();
    request.open("POST","submitform.php");
    formData.append("serialnumber", serialNumber++);
    request.send(formData);
    
    这样你就可以在发送请求之前自由地附加不一定是用户编辑的字段到表单数据里.

    3、使用FormData对象上传文件EDIT

    你还可以使用FormData上传文件。使用的时候需要在表单中添加一个文件类型的input:
    
    <form enctype="multipart/form-data" method="post" name="fileinfo">
    <label>Your email address:</label>
    <input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br />
    <label>Custom file label:</label>
    <input type="text" name="filelabel" size="12" maxlength="32" /><br />
    <label>File to stash:</label>
    <input type="file" name="file" required />
    <input type="submit" value="Stash the file!" />
    </form>
    
    然后使用下面的代码发送请求:
    
    var form = document.forms.namedItem("fileinfo");
    form.addEventListener('submit', function(ev) {
    var oOutput = document.querySelector("div"),oData = new FormData(form);
    oData.append("CustomField", "This is some extra data");
    var oReq = new XMLHttpRequest();
    oReq.open("POST", "stash.php", true);
    oReq.onload = function(oEvent) {
       if (oReq.status == 200) {
         oOutput.innerHTML = "Uploaded!";
       } else {
         oOutput.innerHTML = "Error " + oReq.status + " occurred when trying to upload your file.<br />";
       }};
    oReq.send(oData);
    ev.preventDefault();}, false);
    
    注意:如果FormData对象是通过表单创建的,则表单中指定的请求方式会被应用到方法open()中 。
    你还可以直接向FormData对象附加File或Blob类型的文件,如下所示:
    
    data.append("myfile", myBlob, "filename.txt");
    
    使用appned()方法时,可以通过第三个可选参数设置发送请求的头 Content-Disposition 指定文件名。如果不指定文件名(或者不支持该参数时),将使用名字“blob”。
    
    如果你设置正确的配置项,你也可以通过jQuery来使用FormData对象:
    
    var fd = new FormData(document.querySelector("form"));
    fd.append("CustomField", "This is some extra data");
    $.ajax({
      url: "stash.php",
      type: "POST", 
      data: fd,
      processData: false,//不处理数据
      contentType: false// 不设置内容类型
    });
    
    通过AJAX提交表单和上传文件可以不使用FormData对象EDIT
  • 相关阅读:
    win shift s截图不能用(已解决)
    阿里云ssl证书过期怎么解决 (免费SSL证书) 三步解决
    图解 Java 数据结构
    微信小程序简介
    序列化类外键字段的覆盖,十大接口序列化总结,视图家族
    response二次封装,夺标关系优化,多表序列化,十大接口
    内部类,drf响应类,序列化与反序列化
    drf以及django应用
    DRF框架知识总览
    实例成员:计算属性 监听属性以及vue的项目开发
  • 原文地址:https://www.cnblogs.com/zrbfree/p/7273524.html
Copyright © 2011-2022 走看看