zoukankan      html  css  js  c++  java
  • FormData

    1. FormData对象的作用:

    ① 模拟HTML表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式

    ② 异步上传二进制文件

    2. FormData对象的使用:

    ① 准备HTML表单

    注意:

    • 这个表单不需要请求方式和请求地址,这些内容可以在Ajax中设置。
    • formdata对象不能用于get请求,因为formdata的数据要放到send()方法中,而get请求方式的请求参数只能放在请求地址的后面。
    • 表单中的input控件必须要有name属性,因为当我们把表单提交到服务器的时候,表单的name属性会作为请求参数的属性名字。
    • 表单中的提交按钮不是submit,如果是submit的话,点击会有默认的提交行为。
    • 表单对象的好处是,不需要我们单独的一个一个的去获取指定的表单控件的值。
    <form id="form">
         <input type="text" name="username" />
         <input type="password" name="password" />
         <input type="button"/>
    </form>

    ② 将HTML表单转化为formData对象

    var form = document.getElementById('form'); 
    var formData = new FormData(form);

    ③ 提交表单对象

    xhr.send(formData);

    注意:服务器端bodyParser模块(用来处理post请求)不能解析formData对象表单数据,我们需要使用formidable模块进行解析

    // 解析客户端传递过来的FormData对象
    form.parse(req, (err, fields, files) => {...})
    // 第一个参数是错误对象,第二个参数保存的是表单中普通的请求参数,第三个参数保存的是和文件上传相关的信息

    3. FormData对象的实例方法:

    ① 获取表单对象中属性的值

    formData.get('key');

    ② 设置表单对象中属性的值

    formData.set('key', 'value');

    ③ 删除表单对象中属性的值

    删除属性的应用场景:输入两次密码(原密码和确认密码),但是提交给服务器的时候只用提交一份,所以需要删除掉确认密码。

    formData.delete('key');

    ④ 向表单对象中追加属性值

    formData.append('key', 'value');

    注意:set方法与append方法的区别是,在属性名已存在的情况下,set会覆盖已有键名的值,append会保留两个值

    4. FormData二进制文件上传:

    <input type="file" id="file"/>
    var file = document.getElementById('file')
    // 当用户选择文件的时候
    file.onchange = function () {
         // 创建空表单对象
         var formData = new FormData();
         // 将用户选择的二进制文件追加到表单对象中
         formData.append('attrName', this.files[0]);
         // 配置ajax对象,请求方式必须为post
         xhr.open('post', 'www.example.com');
         xhr.send(formData);
    }

    注意:用户选择的文件中的files属性是文件集合,即使只有一个值也是集合,需要用files[0]的形式表示(一般每次都只是选择一个文件上传)

    formidable方法详解:https://www.cnblogs.com/yuanke/archive/2016/02/26/5221853.html

    5. FormData文件上传进度展示:

    <div class="progress">
        <div class="progress-bar" style=" 0%;" id="bar">0%</div>
    </div>
    // 当用户选择文件的时候
    file.onchange = function () {
         // 文件上传过程中持续触发onprogress事件
         xhr.upload.onprogress = function (ev) {
             // 当前上传文件大小/文件总大小 再将结果转换为百分数
             // 将结果赋值给进度条的宽度属性 
             bar.style.width = (ev.loaded / ev.total) * 100 + '%';
         }
    }

    6. FormData文件上传图片即时预览:

    在我们将图片上传到服务器端以后,服务器端通常都会将图片地址做为响应数据传递到客户端,客户端可以从响应数据中获取图片地址,然后将图片再显示在页面中。

    注意:获取的文件地址是服务器端电脑的硬盘地址,但是我们是不能直接访问服务器端电脑的硬盘地址的,我们只需要访问uploads后面的相对路径

    uploads文件夹存放在public静态资源文件夹下面,而静态文件是可以直接在地址栏访问的,所以在服务器端需要把文件路径进行处理:

    以public为分隔符,截取后面的字符串,然后利用这个相对路径去显示图片。

    注意,img.src赋值后不能直接将DOM元素追加到页面中,因为向服务器获取图片也需要时间,需要等到图片加载完之后才能追加。因此需要使用img.onload()

    xhr.onload = function () {
         var result = JSON.parse(xhr.responseText);
         var img = document.createElement('img');
         // 给图片标签设置src属性
         img.src = result.src;
         // 当图片加载完成以后
         img.onload = function () {
             // 将图片显示在页面中
             document.body.appendChild(this);
         }
    }
  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/zcy9838/p/13057693.html
Copyright © 2011-2022 走看看