欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScrip如果基于url實現(xiàn)圖片下載

 更新時間:2020年07月03日 09:56:05   作者:奔跑的太陽花  
這篇文章主要介紹了JavaScrip如果基于url實現(xiàn)圖片下載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1.H5 download屬性

function downFile(content, filename) {
  // 創(chuàng)建隱藏的可下載鏈接
  var eleLink = document.createElement('a');
  eleLink.download = filename;
  eleLink.style.display = 'none';
  // 字符內(nèi)容轉(zhuǎn)變成blob地址
  var blob = new Blob([content]);
  eleLink.href = URL.createObjectURL(blob);
  // 觸發(fā)點擊
  document.body.appendChild(eleLink);
  eleLink.click();
  // 然后移除
  document.body.removeChild(eleLink);
};

downFile(下載地址, 保存名稱);

2.iframe方式

// if (typeof(download.iframe) == 'undefined') {
      //   var iframe = document.createElement('iframe');
      //   download.iframe = iframe;
      //   document.body.appendChild(download.iframe);
      // };
      // download.iframe.src = newdownloadUrl;
      // download.iframe.style.display = "none";

3.form方式

// var $eleForm = $("<form method='get'></form>");
      // $eleForm.attr("action", "https://codeload.github.com/douban/douban-client/legacy.zip/master");
      // $eleForm.attr("action", url);
      // $(document.body).append($eleForm);
      // $eleForm.submit();

downloadIamge(imgsrc, name) {//下載圖片地址和圖片名
 let image = new Image();
 // 解決跨域 Canvas 污染問題
 image.setAttribute("crossOrigin", "anonymous");
 image.onload = function() {
  let canvas = document.createElement("canvas");
  canvas.width = image.width;
  canvas.height = image.height;
  let context = canvas.getContext("2d");
  context.drawImage(image, 0, 0, image.width, image.height);
  let url = canvas.toDataURL("image/png"); //得到圖片的base64編碼數(shù)據(jù)
  let a = document.createElement("a"); // 生成一個a元素
  let event = new MouseEvent("click"); // 創(chuàng)建一個單擊事件
  a.download = name || "photo"; // 設(shè)置圖片名稱
  a.href = url; // 將生成的URL設(shè)置為a.href屬性
  a.dispatchEvent(event); // 觸發(fā)a的單擊事件
 };
 image.src = imgsrc;
},

原理

我們先看看 download 的使用方法:

<a href="http://somehost/somefile.zip" rel="external nofollow" rel="external nofollow" download="filename.zip">Download file</a>

看看上面的代碼,只要為 <a> 標簽添加 download 屬性,我們點擊這個鏈接的時候就會自動下載文件了~

順便說下,download 的屬性值是可選的,它用來指定下載文件的文件名。像上面的例子中,我們下載到本地的文件名就會是 filename.zip 拉,如果不指定的話,它就會是 somefile.zip 這個名字拉!

看到這里,你可能會說,坑爹啊,這明明是用 HTML 5 的新特性來實現(xiàn)下載文件嘛,說好的用 JavaScript 下載文件呢?

事實上,用 JavaScript 來下載文件也是利用這一特性來實現(xiàn)的,我們的 JavaScript 代碼不外乎就是:

  • 用 JavaScript 創(chuàng)建一個隱藏的 <a> 標簽
  • 設(shè)置它的 href 屬性
  • 設(shè)置它的 download 屬性
  • 用 JavaScript 來觸發(fā)這個它的 click 事件

翻譯成 JavaScript 代碼就是:

var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
var filename = 'what-you-want.txt';
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);

好拉,是不是看到有個陌生的東東呢?

window.URL

window.URL 里面有兩個方法:

createObjectURL 用 blob 對象來創(chuàng)建一個 object URL(它是一個 DOMString),我們可以用這個 object URL 來表示某個 blob 對象,這個 object URL 可以用在 href 和 src 之類的屬性上。

revokeObjectURL 釋放由 createObjectURL 創(chuàng)建的 object URL,當該 object URL 不需要的時候,我們要主動調(diào)用這個方法來獲取最佳性能和內(nèi)存使用。

知道了這兩個方法之后,我們再回去看看上面的例子就很容易理解了吧!只是用 blob 對象來創(chuàng)建一條 URL,然后讓 <a> 標簽引用該 URL,然后觸發(fā)個點擊事件,就可以下載文件了!

那么問題來了,blob 對象哪里來?

Blob 對象

Blob 全稱是 Binary large object,它表示一個類文件對象,可以用它來表示一個文件。根據(jù) MDN 上面的說法,F(xiàn)ile API 也是基于 blob 來實現(xiàn)的。

由于本文的主題是講 JavaScript 下載文件,那我們構(gòu)建 blob 的方式就是通過服務(wù)器返回的文件來創(chuàng)建 blob 拉!
而最簡單的方式就是用 fetch API 了,我們可以整合上面的例子:

fetch('http://somehost/somefile.zip').then(res => res.blob().then(blob => {
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
var filename = 'myfile.zip';
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))

很簡單對吧!

你可能會問,何必這么麻煩呢?直接寫成下面這樣不就好了:

<a href="http://somehost/somefile.zip" rel="external nofollow" rel="external nofollow" download="myfile.zip">Download file</a>
嗯,對于這種寫法,我只能說,你做的太正確了!如果你要下載的是已經(jīng)存在服務(wù)器上面的靜態(tài)文件的話,那么寫成這樣是最方便的。瀏覽器會幫你處理整個下載過程,不需要你干涉。如果你用 blob 的方式來下載文件的話,會有下面這些限制的:

限制一:不同瀏覽器對 blob 對象有不同的限制

具體看看下面這個表格(出自 FileSaver.js):

Browser Constructs as Filenames Max Blob Size Dependencies
Firefox 20+ Blob Yes 800 MiB None
Firefox < 20 data: URI No n/a Blob.js
Chrome Blob Yes 500 MiB None
Chrome for Android Blob Yes 500 MiB None
Edge Blob Yes ? None
IE 10+ Blob Yes 600 MiB None
Opera 15+ Blob Yes 500 MiB None
Opera < 15 data: URI No n/a Blob.js
Safari 6.1+* Blob No ? None
Safari < 6 data: URI No n/a Blob.js

限制二:構(gòu)建完 blob 對象后才會轉(zhuǎn)換成文件

這一點限制對小文件(幾十kb)可能沒什么影響,但對稍微大一點的文件影響就很大了。試想,用戶要下載一個 100mb 的文件,如

果他點擊了下載按鈕之后沒看到下載提示的話,他肯定會繼續(xù)按,等他按了幾次之后還沒看到下載提示時,他就會抱怨我們的網(wǎng)站,然后離開了。

然而事實上下載的的確確發(fā)生了,只是要等到下載完文件之后才能構(gòu)建 blob 對象,再轉(zhuǎn)化成文件。而且,用戶再觸發(fā)多幾次下載就會造成一些資源上的浪費。

因此,如果是要下載大文件的話,還是推薦直接創(chuàng)建一個 <a> 標簽拉~

寫 html 也好,寫 JavaScript 動態(tài)創(chuàng)建也好,用自己喜歡的方式去創(chuàng)建就好了。

為什么要用 JavaScript 下載文件

好拉,說了半天,其實我們一直說的都是:「不要用 JavaScript 下載文件拉,限制多多,又不好用,直接用 html 就好拉,簡單方便又快捷」這個論調(diào)。

事實上也確實如此,但有些時候我們確實需要通過 JavaScript 來做一些預(yù)處理。

權(quán)限校驗

有些時候,我們需要對下載做一些限制,最常見的就是權(quán)限校驗了,如檢查該用戶是否有下載的權(quán)限,是否有高速下載的權(quán)限等等。這時候,我們可以利用 JavaScript 做一些預(yù)處理。如:

fetch('http://somehost/check-permission', options).then(res => {
if (res.code === 0) {
var a = document.createElement('a');
var url = res.data.url;
var filename = 'myfile.zip';
a.href = url;
a.download = filename;
a.click();
} else {
alert('You have no permission to download the file!');
}
});

在這個例子里面,我們沒有用 blob 來構(gòu)建 URL,而是通過后端服務(wù)器來計算出用戶的下載鏈接,然后再利用之前提到的動態(tài)創(chuàng)建 <a> 標簽的方式來實現(xiàn)下載,很簡單吧!

動態(tài)文件

動態(tài)生成文件然后返回給客戶端也是一個很常見的需求,譬如我們有時候需要做導(dǎo)出數(shù)據(jù)的功能,把數(shù)據(jù)庫中的某些數(shù)據(jù)導(dǎo)出到 Excel 中,然后再返回客戶端。

這時候我們就不能簡單的指定 href 屬性,因為對應(yīng)的 URL 并不存在。

我們只能通過 JavaScript 對服務(wù)器發(fā)出一個請求,通知它去生成某個文件,然后把對應(yīng)的 URL 返回給客戶端。

有沒有感覺這個過程和上面「權(quán)限校驗」一節(jié)很像?肯定拉,因為我們只是對 URL 做了一些預(yù)處理而已嘛~

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • echarts餅圖各個板塊之間的空隙如何實現(xiàn)

    echarts餅圖各個板塊之間的空隙如何實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于echarts餅圖各個板塊之間的空隙如何實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • js控制網(wǎng)頁前進和后退的方法

    js控制網(wǎng)頁前進和后退的方法

    這篇文章主要介紹了js控制網(wǎng)頁前進和后退的方法,涉及javascript中history.go方法的相關(guān)使用技巧,非常簡單實用,需要的朋友可以參考下
    2015-06-06
  • javascript作用域鏈與執(zhí)行環(huán)境詳解

    javascript作用域鏈與執(zhí)行環(huán)境詳解

    這篇文章主要為大家詳細介紹了javascript作用域鏈與執(zhí)行環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • js文字滾動停頓效果代碼

    js文字滾動停頓效果代碼

    javascript文字滾動停頓效果的實現(xiàn)代碼
    2008-06-06
  • 基于js?+?html2canvas實現(xiàn)網(wǎng)頁放大鏡功能

    基于js?+?html2canvas實現(xiàn)網(wǎng)頁放大鏡功能

    最近接到任務(wù),需實現(xiàn)【網(wǎng)頁】放大鏡的效果,百度搜索?【js?放大鏡】關(guān)鍵字,千篇一律的都是一些仿淘寶/京東等電商網(wǎng)站中查看規(guī)格大圖的效果實現(xiàn),根本無法滿足我的需求,于是自己花了點時間調(diào)研實現(xiàn),在這里分享給大家,感興趣的朋友可以參考下
    2023-12-12
  • js 字符串操作函數(shù)

    js 字符串操作函數(shù)

    js 字符串操作函數(shù)小結(jié)。
    2009-07-07
  • js中一個函數(shù)獲取另一個函數(shù)返回值問題探討

    js中一個函數(shù)獲取另一個函數(shù)返回值問題探討

    在本文將為大家詳細探討下js中一個函數(shù)獲取另一個函數(shù)返回值問題,比較模糊的朋友可以學(xué)習(xí)下哦
    2013-11-11
  • web前端頁面生成exe可執(zhí)行文件的方法

    web前端頁面生成exe可執(zhí)行文件的方法

    這篇文章給大家介紹了Electron 怎么將網(wǎng)頁打包成桌面應(yīng)用(web前端頁面怎么生成exe可執(zhí)行文件),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-02-02
  • JavaScript中實現(xiàn)Map的示例代碼

    JavaScript中實現(xiàn)Map的示例代碼

    本篇文章給大家介紹javascript中實現(xiàn)map的示例代碼,代碼寫的簡單易懂,可以獲取、刪除鍵值,剛興趣的朋友跟著腳本之家小編一起學(xué)習(xí)吧。
    2015-09-09
  • JavaScript實現(xiàn)非常簡單實用的下拉菜單效果

    JavaScript實現(xiàn)非常簡單實用的下拉菜單效果

    這篇文章主要介紹了JavaScript實現(xiàn)非常簡單實用的下拉菜單效果,通過定義顯示及隱藏菜單項及鼠標事件調(diào)用該函數(shù)實現(xiàn)下拉菜單功能,需要的朋友可以參考下
    2015-08-08

最新評論