zoukankan      html  css  js  c++  java
  • 文件下载

      今天在项目中遇到了一个问题,本来在a标签的href中有下载文件的地址,但是点击无效,经定位发现原来是js脚本中将所有的a标签的默认行为阻止了,a标签的点击事件了调用了e.preventDefault();故在此总结下。

    文件下载常用的两种方式

    1. 通过a标签,href直接指向服务器的文件地址

      <a id= "download" href="upload.txt"></a>下载

    2. 通过后端服务下载文件

      <a id= "download" href="/service/upload?id=123"></a>下载

    3. 将图片作为附件下载

      在浏览器中,点击链接一般会在新的标签页显示图片,HTML5增加了download下载属性,通过这个属性浏览器会让此文件通过下载方式处理。也可以给属性一个值做为下载文件名 download="filename"

      可以使用  if('download'in document.createElement('a')) 判断浏览器的支持情况

      <a id= "download" href="/service/a.png" download="filename.txt">下载图片</a>

      针对第一种情况,如果该页面中阻止了a标签的默认行为那该怎么办呢?

      可能大家会想到使用window.open方法,给下载按钮添加点击事件 调用window.open("文件地址");没错,这样确实可以,但是点击后会新开一个空窗口,那怎么实现不新开窗口呢?

      在w3cSchool上发现 window.open(URL,name,features,replace) 中的第二个参数 是一个可选的字符串,该字符串是一个由逗号分隔的特征列表,其中包括数字、字母和下划线,该字符声明了新窗口的名称。这个名称可以用作标记 <a> 和 <form> 的属性 target 的值。如果该参数指定了一个已经存在的窗口,那么 open() 方法就不再创建一个新窗口,而只是返回对指定窗口的引用。那么就可以在当前页面中添加一个iframe 就可以实现

    <iframe name="downloadWnd" style="height:0;0"></iframe>

    $("#download").click(function(e){

      window.open("要下载的文件地址","downloadWnd");

    });

    由此我想到了另外一种使用场景--页面文件无刷新上传,文件上传一般通过form表单上传

    <iframe name="uploadWnd" style="height:0;0"></iframe>
    
    <form action="/service/upload/" target="uploadWnd" enctype="multipart/form-data">
    
      <input name="file" type="file"/>
    
      <input type="submit"/>
    
    </form>

     

    获取iframe里边的相应数据

    getResponse: function(frame) {
         var doc = null,
              responseText = '';
    
         try {
              if (frame.contentWindow) {
                   doc = frame.contentWindow.document;
              }
         } catch (err) {
              alert('cannot get iframe.contentWindow document: ' + err);
         }
    
         if(!doc){
              try {
                   doc = frame.contentDocument ? frame.contentDocument : frame.document;
              } catch (err) {
                   alert('cannot get iframe.contentDocument: ' + err);
                   doc = frame.document;
              }
         }
         
         // 获取根节点
         var docRoot = doc.body ? doc.body : doc.documentElement,
              pre = doc.getElementsByTagName('pre')[0],
              b = doc.getElementsByTagName('body')[0];
    
         if (pre) {
              responseText = pre.textContent ? pre.textContent : pre.innerText;
         } else if (b) {
              responseText = b.textContent ? b.textContent : b.innerText;
         }
    
         return responseText;
    }
    
    作者:rsky
    出处:http://www.cnblogs.com/rsky
    欢迎转载,但请务必注明出处。
  • 相关阅读:
    产品经理的职责有哪些?到底该做什么?(转) 写的非常好,非常专业
    互联网界产品经理和项目经理(转) 总结的非常好
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第二部分)
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第一部分)
    不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
    大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
    小程序项目别的页面初始化拿到的值为两种状态(已解决)
    vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错(问题已解决)
    qs.stringify和JSON.stringify的使用和区别
    百度地图API-javascript-web地图的应用
  • 原文地址:https://www.cnblogs.com/rsky/p/4081281.html
Copyright © 2011-2022 走看看