• XMLHttpRequest Level2的新功能&&使用jquery简化文件上传


    旧版XMLHttpRequest的缺点

    1、只支持文本数据的传输,无法用来读取和上传文件

    2、传送和接收数据时,没有进度信息,只能提示有没有完成

    XMLHttpRequest Level2的新功能

    1、可以设置HTTP请求的时限

    有时Ajax操作很耗时,而且无法预知要花多少时间,如果网速很慢,用户可能要等很久,新版本的XMLHttpRequest对象增加了 timeout属性,可以设置HTTP请求的时限:

    xhr.timeout = 3000

    xhr.ontimeout = function(event){

            alert('请求超时!')

    }

    上面的语句,将最长等待时间设为3000毫秒。过了这个时限,就自动停止HTTP请求。与之配套的还有一个timeout 事件 用来指定回调函数 

    2、可以使用FormData对象管理表单数据

    Ajax操作往往用来提交表单数据。为了方便表单处理,HTML5新增了一个FormData对象,

    可以模拟表单

    1. // 新建FormData 对象
    2. let fd = new FormData()
    3. // 为FormData 添加表单项
    4. fd.append('uname','吴大友')
    5. fd.append('upwd','123456')
    6. //1、创建xhr对象
    7. let xhr2 = new XMLHttpRequest()
    8. //2、调用open函数 指定请求方式和URL地址
    9. xhr2.open('POST','http://www.liulongbin.top:3006/api/formdata')
    10. //3、设置Content-Type 属性(固定写法)
    11. xhr2.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
    12. //3、调用send函数 发起Ajax 请求 同时将数据以查询字符串的形式 发送给服务器
    13. // 直接提交form 对象 这与提交网页表单的效果 完全一样
    14. xhr2.send(fd)
    15. //4、 监听onreadystatechange 事件
    16. xhr2.onreadystatechange = function () {
    17. // 4.1 监听xhr 对象的请求状态 readyState 和服务器的相应状态 status 固定写法 这里的status 和 res 返回的不是同一个
    18. if (xhr2.readyState === 4 && xhr2.status === 200){
    19. // 4.2 打印服务器相应回来的数据 responseText
    20. let res = JSON.parse(xhr2.responseText)
    21. //JSON.parse() 将JSON字符 转换成 对象数据
    22. console.log(res)
    23. }
    24. }

    也可以用来获取网页表单的值 

    1. // 获取表单元素
    2. let form1 = document.querySelector('#form1')
    3. // 监听表单的submit事件
    4. form1.addEventListener('submit',function (e) {
    5. e.preventDefault()
    6. // 根据form 表单创建 FormData 对象,会自动将表单数据填充到FormData 对象种
    7. let fd1 = new FormData(form1)
    8. // xhr 剩下步骤
    9. let xhr3 = new XMLHttpRequest()
    10. xhr3.open('POST','http://www.liulongbin.top:3006/api/formdata')
    11. //3、设置Content-Type 属性(固定写法)
    12. xhr3.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
    13. //3、调用send函数 发起Ajax 请求 同时将数据以查询字符串的形式 发送给服务器
    14. // 直接提交form 对象 这与提交网页表单的效果 完全一样
    15. xhr3.send(fd1)
    16. //4、 监听onreadystatechange 事件
    17. xhr3.onreadystatechange = function () {
    18. // 4.1 监听xhr 对象的请求状态 readyState 和服务器的相应状态 status 固定写法 这里的status 和 res 返回的不是同一个
    19. if (xhr3.readyState === 4 && xhr3.status === 200){
    20. // 4.2 打印服务器相应回来的数据 responseText
    21. let res = JSON.parse(xhr3.responseText)
    22. //JSON.parse() 将JSON字符 转换成 对象数据
    23. console.log(res)
    24. }
    25. }
    26. })

    3、可以上传文件 并且 获得数据传输的进度信息

    实现步骤:

    1. 定义UI结构
    2. 验证是否选择了文件
    3. 向FormData中追加文件
    4. 使用xhr发起上传文件的请求- xhr.upload.onprogress 事件计算返回进度的百分比,运用合适的组件库渲染到页面上(这里用的是bootstrap)
    5. 监听onreadystatechange事件-完成后移除上传过程与用的样式,添加上传完成时用的样式

    UI结构

    1. 选择按钮和提交按钮
    2. <div>
    3. <input type="file" id="file1" value="选择图片">
    4. <button id="btn">上传图片button>
    5. div>
    6. 进度条显示区域
    7. <div class="progress" style="width: 500px;display: none">
    8. <div class="progress-bar progress-bar-striped active" style="width: 0%" id="plan">
    9. div>
    10. div>
    11. 图片展示区域 上传完成后为此元素增加 src 属性
    12. <img src="" alt="" id="img" width="800" style="display: block">

    script:

    1. let btn = document.querySelector('button')
    2. btn.addEventListener('click',function () {
    3. let files = document.querySelector('#file1').files
    4. if (files.length <= 0){
    5. alert('没有选择文件、请重新选择')
    6. return
    7. }
    8. $('.progress').css('display','block')
    9. let fd = new FormData()
    10. fd.append('avatar',files[0])
    11. let xhr = new XMLHttpRequest()
    12. // 监听 xhr.upload 的 onprogress 事件
    13. xhr.upload.onprogress = function(e){
    14. // e.lengthComputable 是一个布尔值 表示当前上传的资源是否具有可计算的长度
    15. if (e.lengthComputable){
    16. // e.loaded 已经传输的字节 e.total 需要传输的总字节
    17. let schedule = Math.ceil((e.loaded / e.total) * 100)
    18. // 赋值更新进度条的宽度和百分比
    19. $('#plan').attr('style','width:'+schedule+'%').html(schedule+'%')
    20. }
    21. }
    22. xhr.upload.onload = function(){
    23. $('#plan').removeClass().addClass('progress-bar progress-bar-success')
    24. setTimeout(function () {
    25. $('.progress').css('display','none')
    26. },250)
    27. }
    28. xhr.open('POST','http://www.liulongbin.top:3006/api/upload/avatar')
    29. xhr.send(fd)
    30. xhr.onreadystatechange = function () {
    31. if (xhr.readyState === 4 && xhr.status === 200){
    32. let data = JSON.parse(xhr.responseText)
    33. if (data.status === 200){ // 内部再判断一下 因为和外面的 status 不是同一个
    34. // 将置留的img 加上src
    35. let img = document.querySelector('#img')
    36. img.src = 'http://www.liulongbin.top:3006'+data.url
    37. }else {
    38. console.log(data.message)
    39. }
    40. }
    41. }
    42. })

    依赖的资源:

     

     

     

    使用jquery简化文件上传 

    jquery使用Ajax上传文件时 

    只需要添加配置

            // 不修改content-Type 属性 使用FormData 默认的Content-Type值

            contentType:false,

            // 不对FormData 中的数据进行url 编码 而是将FormData 原样数据发送到服务器

            processData:false,

    并且运用ajaxStart   ajaxStop 两个回调函数 进行等待图片的显示和隐藏操作

      $(document).ajaxStart(function () {

        $('#load').fadeIn()

      })

      $(document).ajaxStop(function () {

        $('#load').fadeOut()

      })

     

    完成代码: 

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>17jQuery简化文件上传title>
    6. <script src="http://www.wsg3096.com/ass/jquery-3.6.0.js">script>
    7. <style>
    8. #load{
    9. position: absolute;
    10. transform: translate(-50%,-50%);
    11. }
    12. style>
    13. head>
    14. <body>
    15. <input type="file" id="file1">
    16. <button>上传button>
    17. <img src="" alt="" style="display: block" id="wsg">
    18. <img src="pic/load.gif" alt="" style="max-width: 360px;display: none" id="load">
    19. <img src="pic/jquery-upload.jpg" alt="" style="display: block">
    20. <script>
    21. $('button').on('click',function () {
    22. // [0] 转化成dom 对象
    23. let files = $('#file1')[0].files
    24. if (files.length<= 0){
    25. alert('请选择文件后再上传')
    26. return
    27. }else {
    28. let fd = new FormData()
    29. fd.append('avatar',files[0])
    30. $.ajax({
    31. method:'POST',
    32. url:'http://www.liulongbin.top:3006/api/upload/avatar',
    33. data:fd,
    34. // 不修改content-Type 属性 使用FormData 默认的Content-Type值
    35. contentType:false,
    36. // 不对FormData 中的数据进行url 编码 而是将FormData 原样数据发送到服务器
    37. processData:false,
    38. success:function (res) {
    39. console.log(res)
    40. let url = 'http://www.liulongbin.top:3006'+res.url
    41. $('#wsg').prop('src',url)
    42. }
    43. })
    44. }
    45. })
    46. $(document).ajaxStart(function () {
    47. $('#load').fadeIn()
    48. })
    49. $(document).ajaxStop(function () {
    50. $('#load').fadeOut()
    51. })
    52. script>
    53. body>
    54. html>

  • 相关阅读:
    flutter创建不同样式的按钮,背景色,边框,圆角,圆形,大小都可以设置
    C++day1
    React中Toast 库推荐
    Allegro如何添加泪滴操作指导
    【Linux】- 权限管理
    技术分享 | 接口自动化测试如何处理 Header cookie
    代码随想录算法训练营第四十一天|卡码网46. 携带研究材料(第六期模拟笔试)、416. 分割等和子集
    类加载器ClassLoader
    vue-:visible.sync的作用
    redis搭建主从、redis搭建集群、redis中StrictRedis()、RedisCluster()方法与python交互
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126153289