zoukankan      html  css  js  c++  java
  • FormData

    FormData对象介绍

    FormData对象自动收集表单数据,用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而发送数据具有同样形式。如果使用FormData 收集数据,上传文件,也可以不设置enctype 属性。

    从零开始创建FormData对象

    创建一个FormData对象,然后调用它的append()方法来添加字段

    var formData = new FormData();
    
    formData.append("username", "Groucho");
    formData.append("accountnum", 123456); //数字123456会被立即转换成字符串 "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 对象的字段类型可以是 BlobFile, 或者 string: 如果它的字段类型不是Blob也不是File,则会被转换成字符串类)。

    上面的示例创建了一个FormData实例,包含"username", "accountnum", "userfile" 和 "webmasterfile"四个字段,然后使用XMLHttpRequestsend()方法发送表单数据。字段 "webmasterfile" 是 Blob类型。一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。 File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。你可以通过 Blob() 构造函数创建一个Blob对象。

    通过HTML表单创建FormData对象

    构造一个包含Form表单数据的FormData对象,需要在创建FormData对象时指定表单的元素

    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);

    使用FormData对象上传文件

    你还可以使用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>
    <div></div>

    使用下面的代码发送请求:

    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");

    使用append()方法时,可以通过第三个可选参数设置发送请求的头 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   // 不设置内容类型
    });

    通过原生JavaScriot 使用FormData对象

    <form>
      <p>
        <label>附件</label>
        <input type="file" name="file[]" class="file"   multiple="multiple"> 
      </p>
      <p><input type="submit" value="upload" ></p>
    </form>
    
    <script>
    var fm=document.getElementsByTagName('form')[0];
     fm.onsubmit=function(ev){
       var fd=new FormData(fm);
       var xhr=new XMLHttpRequest();
       // 上传进度-- 可以添加上传进度条
       xhr.upload.onprogress=function(evt){
           console.log(evt)
       }
       // 上传状态改变时
       xhr.onreadystatechange=function(){
          if(xhr.readyState==4){
            console.log(xhr.responseText);
          }
       };
       // 访问页面
       xhr.open('post',"./upfile.php");
       // 发送数据
       xhr.send(fd);
       // 阻止表单提交跳转页面
       ev.preventDefault();
     }
    </script>

    php上传示例代码

    <?php
    
    if(!empty($_FILES["file"]["name"][0]))
    {
       $file_c=count($_FILES["file"]["name"]);
       
       $file_array=array();
       $file_name=$_FILES["file"]["name"];
       
       for($i=0;$i<$file_c;$i++)
       {
           // 这里可以添加 判断文件类型 大小的代码,在此省略
           
           $file_array[$i]["name"]=$file_name[$i];
           $file_array[$i]["type"]=$_FILES["file"]["type"][$i];
           $file_array[$i]["tmp_name"]=$_FILES["file"]["tmp_name"][$i];
           $file_array[$i]["error"]=$_FILES["file"]["error"][$i];
           $file_array[$i]["size"]=$_FILES["file"]["size"][$i];
          
       }
       
       $up_dir="./upload/";
       if(!is_dir($up_dir))
        {
            @mkdir($up_dir,0777);
        }
       foreach($file_array as $k=>$v)
       {
            $ext=pathinfo($v['name'],PATHINFO_EXTENSION);
    
           $new_name=$up_dir.mt_rand(0,100000000).".".$ext;
    
           if(move_uploaded_file($v["tmp_name"],$new_name))
           {
               echo $v["tmp_name"]."上传文件ok";
           }else
           {
               echo $v["tmp_name"].file_up_error($v["error"])."上传文件失败";
               continue;
           }
           
       }
    }
    else
    {
        echo '没有上传文件';exit;
    }
    
    
        //PHP上传失败
    function file_up_error($f_error)
    {
        switch($f_error){
            case '1':
                $error = '超过php.ini允许的大小。';
                break;
            case '2':
                $error = '超过表单允许的大小。';
                break;
            case '3':
                $error = '图片只有部分被上传。';
                break;
            case '4':
                $error = '请选择图片。';
                break;
            case '6':
                $error = '找不到临时目录。';
                break;
            case '7':
                $error = '写文件到硬盘出错。';
                break;
            case '8':
                $error = 'File upload stopped by extension。';
                break;
            case '999':
            default:
                $error = '未知错误。';
        }
        return $error;
    }
    View Code

    相关文章: 上传文件显示进度条

  • 相关阅读:
    [iOS基础控件
    [iOS基础控件
    后端程序员必会常用Linux命令总结
    MySQL数据库SQL语句基本操作
    MySQL拓展操作
    http/1.0/1.1/2.0与https的比较
    http中的socket是怎么一回事
    Django content_type 简介及其应用
    WEB主流框架技术(汇聚页)
    WEB基础技术(汇聚页)
  • 原文地址:https://www.cnblogs.com/xuey/p/10019624.html
Copyright © 2011-2022 走看看