下载文件实现的常见方式

  下载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>

原文地址:https://www.cnblogs.com/EnSnail/p/9018946.html

时间: 2024-10-10 04:11:45

下载文件实现的常见方式的相关文章

Asp.Net 下载文件的几种方式

asp.net下载文件几种方式 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题. 代码如下: */ Response.ContentType = "application/x-zip-compressed";

【文件下载】Java下载文件的几种方式

1.以流的方式下载. public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径. File file = new File(path); // 取得文件名. String filename = file.getName(); // 取得文件的后缀名. String ext = filename.substring(filename.lastIn

Windows从web下载文件的几种方式

最近搞app自动化测试,需要自动从网页上下载apk用于测试,顺便学习了几种从web下载文件的方式. 一.PowerShell DownloadFile 命令 PowerShell 是一种winodws原生的脚本语言,使用很方便,可以实现很多复杂的功能. 首先启动PowerShell,可以在cmd里执行 start powershell,也可以按住shift建右击选择打开powershell 启动powershell后输入如下命令: $client = new-object System.Net.

java 从网上下载文件的几种方式 (转)

package com.github.pandafang.tool; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.nio.channels.Channels;import java.nio.cha

php下载文件的一种方式

<?php ob_start(); // $file_name="cookie.jpg"; $file_name="abc.jpg"; //用以解决中文不能显示出来的问题 $file_name=iconv("utf-8","gb2312",$file_name); //$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/&q

C++服务器下载文件的两种方式

#include <afxinet.h>#include "wininet.h" #pragma comment( lib, "wininet.lib" ) string remoteIP = "http://www.test.com:8001"; string testIP = getDomain("IP"); string testPort = getDomain("PORT"); if (

向linux服务器上传下载文件方式收集

向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 命令格式: scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径> 举例: scp /home/work/source.

springmvc和servlet在上传和下载文件(保持文件夹和存储数据库Blob两种方式)

参与该项目的文件上传和下载.一旦struts2下完成,今天springmvc再来一遍.发现springmvc特别好包,基本上不具备的几行代码即可完成,下面的代码贴: FileUpAndDown.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <title>using commons Upload to

C# Http方式下载文件到本地

下文代码是从网络(http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html)得来,亲测好用.我中修改了下格式和注释,版权属于原作者. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; namespace ConsoleTest { class