-.- -.-
首页
  • 分类
  • 标签
  • 归档
  • Lodash 源码分析 (opens new window)
Mozilla (opens new window)
GitHub (opens new window)

江月何年初照人

首页
  • 分类
  • 标签
  • 归档
  • Lodash 源码分析 (opens new window)
Mozilla (opens new window)
GitHub (opens new window)
  • a标签下载限制

    • 起因
      • 解决
        • before
        • after
      • 浏览器对 a 标签 href 长度的限制
      江月何年初照人
      2022-08-08
      随笔

      a标签下载限制

      # a标签 href 长度过长,导致下载失败的问题

      # 起因

      在一个项目中,需要前端根据dom生成图片来进行下载,生成图片使用的 html2canvas ,然后通过 canvas 的 api 获取到图片的 base64数据,然后把数据给到 a标签的 href 属性,通过触发 a 标签的 onclick 事件进行下载~

      整个过程在 chrome 中没有问题, edge 中也没有问题

      但是在 客户使用的 360浏览器中,出现了问题

      下载时会弹出下载窗口,数据大小为 0b,没有下载名称,没有来源

      最后发现是因为 a 标签的 href 属性过长导致的下载失败

      # 解决

      将 base64 dataURI 转换为 Blob 文件对象,然后 通过 a 标签下载 Blob 即可

      # before

        var w = $("#poster-wrapper").width();
        var h = $("#poster-wrapper").height();
        var canvas = document.createElement("canvas");
        var context = canvas.getContext("2d");
        var scaleBy = 2;
      
      
        canvas.width = w * scaleBy;
        canvas.height = h * scaleBy;
        canvas.style.width = w + "px";
        canvas.style.height = h + "px";
        html2canvas($("#poster-wrapper")[0], {
          allowTaint: true,
          taintTest: true,
          scale:scaleBy,
          canvas: canvas,
          width:w, //dom 原始宽度
          height:h, //dom 原始高度
        }).then(function (canvas) {
            var url = canvas.toDataURL("image/png"); //base64数据
            var download = $('<a></a>')
              .attr("href", url)
              .attr(
                "download",
               'test.png'
              );
            download[0].click();
        })
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29

      # after

      function dataURIToBlob(dataURI) {
        var binStr = atob(dataURI.split(',')[1]),
          len = binStr.length,
          arr = new Uint8Array(len);
      
        for (var i = 0; i < len; i++) {
          arr[i] = binStr.charCodeAt(i);
        }
      
        return new Blob([arr]);
      }
      
      // ...
      var url = canvas.toDataURL("image/png"); //base64数据
      var downloadUrl = URL.createObjectURL(dataURIToBlob(url))
      var download = $('<a></a>')
        .attr("href", downloadUrl)
        .attr(
          "download",
          'test.png'
        );
      // ...
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22

      # 浏览器对 a 标签 href 长度的限制

      IE 最大长度限制为 2048 字节

      Chrome 最大长度限制为 8182 字节

      Firefox 最大长度限制为 65536 字节

      Safari 最大长度限制为 80000 字节

      Opera 最大长度限制为 190000 字节

      编辑 (opens new window)
      上次更新: 2022/08/08 11:18:03
      最近更新
      01
      必应每日一图
      05-27
      02
      小球碰壁反弹动画
      05-26
      03
      关于陀螺仪的一些问题
      05-26
      更多文章>
      Theme by Vdoing | Copyright © 2021-2023 Himawari | MIT License
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式