• 下载文件实现的常见方式


      下载json、csv、excel、img等文件,而不是直接在浏览器打开,在后台管理系统中很常见。那么都有哪些方式可以实现呢?

      方式一:链接,参数不多

            1. a标签,直接实现

    // href 放下载地址; 
    // download 为空,默认是下载地址上的文件名称,可以指定名称,如tp.csv,加download是避免json、img等文件直接在浏览器打开而不是下载;
    // target="_black"在新页面打开,避免当前页闪屏
    <a href="" download="" target="_black">点击下载</a>
    
    // 如需带参,直接在地址后加上url的search参数就可以,注意参数不要太多
    <a class="download link-text" href="/newCrowd/crowdList/downFile?&is_tag=1&fileId=1023" target="_blank">点击下载</a>

      2. window.open,location.href,借助js,点击按钮,调用方法实现

    function downloadFile(url){
        window.open(url);
    }
    
    function downloadFile(url){
        location.href=url;
    }

      方式二:iframe

    // js
    function downloadFile(url){
        var iframe = document.createElement("iframe");  
        document.body.appendChild(iframe);  
        iframe.src =url;
    }
    
    // jq
    function downloadFile(url){
         $("body").append($("<iframe/>").attr("src",url);
    }

      方式三:form表单,参数较多

      1. form表单,不带参

    function downloadFile (){  
        var url = "";  
        var form = $("<form></form>").attr({  
            action : url,  
            method : "post"  
        });  
        form.appendTo($("body")).submit();  
        form.remove();  
    } 

      2. form表单,带参,jq

        function downloadFile (data, url) {
          // data格式
          // obj {key: val}
          // obj {key: [val]}
          // obj {key: {key1: val}}
    
          var dataHtml='';
          for(var i in data){
            var item=data[i];
            var type=typeof item;
            switch(type){
              case 'object':
                if($.isArray(item)){
                  for(var k=0,klen=item.length; k<klen; k++){
                    dataHtml+=createInput(i+'[]',item[k]); // name=key[] value=val
                  }
                }else{
                  for(var k in item){
                    dataHtml+=createInput(i+'['+k+']',item[k]) // name=key[key1] value=val
                  }
                }
              break;
              default:
               dataHtml+=createInput(i,item);
            }
          }
          var exportForm=$("#export_form");
          if(!exportForm.length){             
            $('body').append('<form id="export_form" enctype="multipart/form-data" method="post" target="_blank" action="'+url+'">'+dataHtml+'</form>');
          }else{
            exportForm.html(dataHtml);
          }
          $("#export_form").submit();
          $('#export_form').remove();
          function createInput(name,data){
            return '<input name="'+name+'" type="hidden" value="'+data+'">'
          }  
        }

      3. form 表单,带参,vue,element-ui

    // 组件 download.vue
    <template>
      <div class="download">
        <form :action="downloadUrl" method="post" target="_blank"  style="display: none">
          <template v-for="(value, key) in pageParams">
            <!-- 值为数组或对象 -->
            <template v-if="typeof value === 'object'">
              <input type="hidden" v-if="value.length" v-for="item in value" :name="key+'[]'" :value="item">
              <input type="hidden" v-else v-for="(childValue, childKey) in value" :name="key+'['+childKey+']'" :value="childValue">
            </template>
            <!-- 值为字符串或数字 -->
            <input v-else type="hidden" :name="key" :value="value">
          </template>
          <button type="submit" ref="btnDownload"></button>
        </form>
      </div>
    </template>
    <script>
      export default {
        props: {
          pageParams: {
            type: Object,
            default () {
              return {}
            }
          },
          downloadUrl: {
            type: String,
            required: true,
            default: ''
          }
        },
        methods: {
          downLoad() {
            this.$refs.btnDownload.click();
          }
        }
      }
    </script>
    // 调用
    <template>
        <el-button @click="$refs.download.downLoad()" type="primary" size="small">下载</el-button>
        <download :pageParams="params" :downloadUrl="api.downloadUrl" ref="download"></download>
    </template>
    
    <script>
      import download from 'components/download/download';
      export default {
        data() {
          return {
            api: {
              downloadUrl: `${this.urlBase}/adunit/download`
            },
            params: {}
          }
        },
        components: {download}
      }
    </script>

       方式四:前端组织内容,csv方式下载

      参考:https://blog.csdn.net/oscar999/article/details/16342699

      前面三种方式都是通过前端请求后端接口实现下载,但有时需要前端直接组织内容下载。

    <a href="" download="文件.csv" id="btn">下载</a>
    <a href="" download="中文文件.csv" id="btn_chinese">下载中文</a>
        var dataStr = "col1,col2,col3
    hello,world,english";
        var dataChineseStr = "姓名,年龄!
    张三,34
    王五,32
    李四,25";
    
        console.log()
        // chrome
        if (navigator.appName == "Netscape") {
          var blob = new Blob([dataStr], {type: "text/csv,charset=utf-8"});
          document.getElementById("btn").href = window.URL.createObjectURL(blob);
    
          var blobChinese = new Blob(['ufeff'+dataChineseStr], {type: "text/csv,charset=utf-8"});
          document.getElementById("btn_chinese").href = window.URL.createObjectURL(blobChinese);
        } else {
          document.getElementById("btn").href = "data:text/csv;charset=utf-8," + encodeURIComponent(dataStr);
          document.getElementById("btn_chinese").href = "data:text/csv;charset=utf-8,ufeff" + encodeURIComponent(dataStr);
        }
  • 相关阅读:
    javascript之reduce()方法的使用
    微信小程序开发小结
    小程序解析html之富文本插件wxParse
    vue中复选框全选与反选
    vue好用的图片查看器(v-viewer插件)
    Vue利用canvas实现移动端手写板
    file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度
    js中文输入法字符串截断
    js实现表单序列化的两种方法。
    JS实现剪切板添加网站版权、来源
  • 原文地址:https://www.cnblogs.com/EnSnail/p/9018946.html
Copyright © 2020-2023  润新知