ダウンロードを実現するためのJavaScriptのいくつかの方法

プロジェクト開発の過程で、ダウンロード機能に遭遇することがよくあります。私が使用した方法に基づいて、要約を作成し、この記事を記録として書きました。

まず、ラベルの使用(リクエストの取得)
タグが最も簡単な方法です。ファイルアドレス指定する href属性タグへのインターフェイスをタグとして追加するだけで、ダウンロード属性にダウンロードファイルの名前を指定できます。ダウンロード属性省略可能省略した場合、ブラウザはソースファイル名を自動的に認識します。

<a href="文件地址" download='文件名'>下载</a>
 
//url 文件地址 或 接口地址
function downLoadFile(url) {
    
    
    let a = document.createElement('a')
    a.href = url;
    a.download = '文件名'
    a.click();
} 

長所:
1。ファイルがtxt、png、jpg、およびファイルを開くことをサポートするその他のブラウザの場合、ダウンロードせずにファイルを直接開きます。このとき、ダウンロード属性を追加してダウンロードします。
短所:
1。知っておく必要があります。ダウンロードアドレス;
2、クロスドメインでブラウザが閲覧できるファイルをダウンロード
できません; 3。認証を実行できません;

2、window.open()メソッド(リクエストを取得)

//url 文件地址 或 接口地址
function downLoadFile() {
    
    
	let url = '/xxx/xxx'; //接口
    window.location.href = url;
} 

長所:
1。シンプルでわかりやすい;
短所:
1。ダウンロードの進行状況を知ることができない; 2。URLの
長さの制限とエンコードの問題が発生する;
3。ヘッダーを追加できず、認証を実行できない;
4。ファイルがtxtである、png、jpgこれらのブラウザがファイルを開くことをサポートしている場合、ファイルはダウンロードされませんが、直接開かれます。

3.フォーム送信方法(get request)により
動的にフォームフォームを生成し、フォーム送信機能を利用してダウンロードを実現します。

//url 文件地址 或 接口地址
//data 请求参数:[{key:name,key1:value}]
function downLoadFile(url,data){
    
    
	let form = document.createElement('form');
	for(let i in data){
    
    
		let input = document.createElement('input');
		input.name = data[i].key;
		input.value = data[i].key1;
		form.appendChild(input)
	}
	form.style.display = 'none';
	form.method = "GET";//请求方式
	form.action = 'url'//下载文件地址
	document.body.appendChild(form);
	form.submit();
	document.body.removeChild(form);
}

長所:
1。従来の方法、優れた互換性、URLの長さ制限の問題なし、
短所:
1。ダウンロードの進行状況がわからない、
2。ファイルがtxt、png、jpg、およびファイルを開くことをサポートするその他のブラウザの場合、ファイルを直接ダウンロードして開きます。

4.
iframeを介して動的にiframeを生成します(リクエストの取得、アドレススプライシングパラメーター)。iframeにはsrc属性があり、その本質はhttpリクエストを送信することです。

//url 文件地址 或 接口地址
//id 参数id
function downLoadFile(){
    
    
	let iframe= document.createElement('iframe');
	iframe.src = `${
    
    item.url}?id=${
    
    id}`;
	iframe.style.display = 'none'
	document.body.appendChild(iframe);
}

短所:
1。互換性の問題;
2.ファイルがtxt、png、jpg、およびファイルを開くことをサポートするその他のブラウザの場合、ダウンロードせずに直接ファイルを開きます。

5.タグ付きのblob形式(リクエスト後)を
使用してファイルをBlobバイナリオブジェクト変換し、タグ付きでダウンロードします。

return new Promise((resolve, reject) => {
    
    
    this.$http.defaults.headers['content-type'] = 'application/json;charset=UTF-8'
    this.$http({
    
    
      method: 'post',
      url: '/xxx/xxx', // 接口地址
      data: data, // 参数
      responseType: 'blob' // 表明返回服务器返回的数据类型
    }).then(response => {
    
    
      	if(response.headers.filename != undefined){
    
    
      		resolve(response.data)
	        let blob = new Blob([response.data], {
    
    
	          type: 'application/vnd.ms-excel'
	        })
	        let fileName = Date.parse(new Date()) + '.xlsx'
	        if (window.navigator.msSaveOrOpenBlob) {
    
    
	          navigator.msSaveBlob(blob, fileName)
	        } else {
    
    
	          var link = document.createElement('a')
	          link.href = window.URL.createObjectURL(blob)
	          link.download = fileName
	          let evt = document.createEvent('MouseEvents')
	          evt.initEvent('click',true,true)
	          link.dispatchEvent(evt)
	          //释放内存
	          window.URL.revokeObjectURL(link.href)
	        }
      	}else{
    
    
      		this.$message.error("数据为空!")
      	}
      },
      err => {
    
    
        reject(err)
      }
    )
})

長所:
1。ヘッダーを設定でき、認証も追加できます
。2。ブラウザーで参照できるファイルを直接ダウンロードできます。
短所:
1。IE10では使用できません。

おすすめ

転載: blog.csdn.net/weixin_43299180/article/details/112007458