FormData() 两种不容错过的使用方法

329 阅读2分钟

FormData有两种使用方式

第一种: 一般用于文件上传
    (1)先创建一个空的FormData:  let fd = new FormData()
    (2)使用append()添加参数:  fd.append('参数名',参数值)
第二种: 一键获取form表单所有参数
    let fd = new FormData( form元素 )
    (1)参数必须是form标签,其他标签会报错。  
    (2)fd底层自动帮我们遍历form里面的每一个表单, 将name属性作为参数名,value作为参数值

1. 文件上传

文件上传思路

  1. 给file表单注册onchange事件 
    * 当用户选择图片之后执行
  2. 获取用户选择的图片 
    * this.files[0]
  3. 创建FormData对象 
    * 只有FormData才可以上传文件
  4. 将图片添加到FormData对象中 
    * fd.append('参数名', this.files[0])
  5. 发送ajax请求
    * 文件上传请求方法一定是post, 且请求参数为 FormData对象
  
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>案例-头像上传</title>
    <link rel="stylesheet" href="./lib/bootstrap-v4.6.0.css" />
    <style>
      .thumb-box {
        text-align: center;
        margin-top: 50px;
      }

      .thumb {
        width: 250px;
        height: 250px;
        object-fit: cover;
        border-radius: 50%;
      }
    </style>
  </head>

  <body>
    <div class="thumb-box">
      <!-- 头像 -->
      <img src="./images/cover.jpg" class="img-thumbnail thumb" alt="" />
      <div class="mt-2">
        <!-- 文件选择框 -->
        <!-- accept 属性表示可选择的文件类型 -->
        <!-- image/* 表示只允许选择图片类型的文件 -->
        <input type="file" id="iptFile" accept="image/*" />
        <br />
        <!-- 选择头像图片的按钮 -->
        <button class="btn btn-primary" id="btnChoose">选择 & 上传图片</button>
      </div>
    </div>

    <script src="./lib/axios.js"></script>
    <script>
     
      //1. file类型表单自带一个选择文件点击按钮,当用户选择文件之后就会触发onchange事件
      document.querySelector("#iptFile").onchange = function() {
        //this : file表单
        //(1)获取用户选择的文件
        let file = this.files[0]
        // 非空判断,如果内容为undefined,给出提示
        if (file == undefined) {
          return alert("请选择上传文件!")
        }
        //(2)创建FormData对象, 只有FormData对象才可以上传文件
        let fd = new FormData()
        //(3)添加文件
        //FormData()接口的append()方法会添加一个新值FormData
        //对象内的一个已存在的键中,如果键不存在则会添加该键。
        fd.append("avatar", file)
        //(4)发送ajax请求, 参数为 FormData对象
        axios({
          method: "POST",
          url: "http://www.liulongbin.top:3009/api/upload/avatar",
          data: fd
        }).then(({ data: res }) => {
          console.log(res)
          if (res.code != 200) {
            return alert(res.message)
          }
          // 成功后提示,修改图片路径
          alert("恭喜您,上传头像成功!")
          document.querySelector("img").src = `http://www.liulongbin.top:3009${res.url}`
        })
      }
    </script>
  </body>
</html>

2 表单value值一键上传

    //0.表单按钮需要阻止默认跳转
    e.preventDefault()
    //获取所有的表单
    let inputList = document.querySelectorAll('form input')
    //1.非空判断(正则验证服务器会处理)
    if (Array.from(inputList).some(item => item.value == '')) {
        Toast.info('输入框不能为空')
        return
    }
    //2.获取表单参数
    一键获取form表单所有参数:
        let fd = new FormData( form元素 )
        (1)参数必须是form标签,其他标签会报错。  
        (2)fd底层自动帮我们遍历form里面的每一个表单, 将name属性作为参数名,value作为参数值
    */
    let fd = new FormData(document.querySelector('.add-form'))
    let data = {}
    fd.forEach(function (value, key) {
        data[key] = value
    })
    //判断是新增还是编辑
    let url = '/student/add'
    let method = 'post'
    //编辑ajax与新增ajax不同的地方: (1)路径不同  (2)请求方法不同  (3)多了一个参数id
    if( this.innerText == '确认编辑' ){
        url = '/student/update'
        method = 'put'
        data.id = this.dataset.id
    }

    console.log(data)
    //3.ajax发送请求
    axios({
        url,
        method,
        data
    }).then(res => {
        // 添加成功,重新渲染列表
        if (res.data.code == 0) {
            // a.清空表单  
            document.querySelector(".add-form").reset()
            // b.关闭弹窗
            document.querySelector("#addModal .btn-close").click()
            // c.成功提示
            Toast.success(res.data.message)
            // d.重新加载列表
            initData()
        }
    })
})

以上,码字作图很辛苦,还望不要吝啬手中的赞,你的点赞是我继续更新的最大动力😊!