摘要:前言項(xiàng)目中需要實(shí)現(xiàn)圖片下載功能,第一個(gè)想到的是使用標(biāo)簽的屬性來實(shí)現(xiàn),但是在不同瀏覽器下測(cè)試會(huì)發(fā)現(xiàn),有的瀏覽器無效,點(diǎn)擊后直接預(yù)覽圖片,所以,上網(wǎng)找到了另外一種兼容不同瀏覽器的圖片下載的方法,那就是利用來處理圖片,實(shí)現(xiàn)下載項(xiàng)目中點(diǎn)擊事件綁定點(diǎn)
前言:項(xiàng)目中需要實(shí)現(xiàn)圖片下載功能,第一個(gè)想到的是使用a標(biāo)簽的download屬性來實(shí)現(xiàn),但是在不同瀏覽器下測(cè)試會(huì)發(fā)現(xiàn),有的瀏覽器無效,點(diǎn)擊后直接預(yù)覽圖片,所以,上網(wǎng)找到了另外一種兼容不同瀏覽器的圖片下載的方法,那就是利用canvas來處理圖片,實(shí)現(xiàn)下載;
1.項(xiàng)目中點(diǎn)擊事件綁定:
{{name}}
2.點(diǎn)擊事件中操作:
downloadIamge (imgsrc, name) { const url = imgsrc this.convertUrlToBase64(url).then((base64) => { const blob = this.convertBase64UrlToBlob(base64) if (getBrowser() === "IE" || getBrowser() === "Edge") { window.navigator.msSaveBlob(blob, name) } else { const a = document.createElement("a") const body = document.querySelector("body") a.download = name || "image" a.href = URL.createObjectURL(blob) a.style.display = "none" body.appendChild(a) a.click() body.removeChild(a) window.URL.revokeObjectURL(a.href) } }) },
分析:
3.this.convertUrlToBase64(url)就是利用canvas和toDataURL把圖片轉(zhuǎn)成base64格式并返回
convertUrlToBase64 (url) { return new Promise((resolve, reject) => { const img = new Image() img.crossOrigin = "Anonymous" img.src = url img.onload = function () { const canvas = document.createElement("canvas") canvas.width = img.width canvas.height = img.height const ctx = canvas.getContext("2d") ctx.drawImage(img, 0, 0, img.width, img.height) const ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase() const dataURL = canvas.toDataURL("image/" + ext) const base64 = { dataURL: dataURL, type: "image/" + ext, ext: ext } resolve(base64) } }) },
其中:img.crossOrigin = "Anonymous"是前端對(duì)圖片的跨域處理;
4.this.convertBase64UrlToBlob(base64)是將圖片base64流文件轉(zhuǎn)成blob文件
convertBase64UrlToBlob (base64) { const parts = base64.dataURL.split("base64,") const contentType = parts[0].split(":")[1] const raw = window.atob(parts[1]) const rawLength = raw.length const uInt8Array = new Uint8Array(rawLength) for (let i = 0; i < rawLength; i++) { uInt8Array[i] = raw.charCodeAt(i) } return new Blob([uInt8Array], { type: contentType }) },
5.getBrowser()用來判斷瀏覽器,解決瀏覽器兼容性問題:
import { getBrowser } from "@/utils/utils"
export function getBrowser () { const userAgent = navigator.userAgent if (userAgent.indexOf("OPR") > -1) { return "Opera" } if (userAgent.indexOf("Firefox") > -1) { return "FF" } if (userAgent.indexOf("Trident") > -1) { return "IE" } if (userAgent.indexOf("Edge") > -1) { return "Edge" } if (userAgent.indexOf("Chrome") > -1) { return "Chrome" } if (userAgent.indexOf("Safari") > -1) { return "Safari" } }
6.如果是IE或者Edge瀏覽器,可以直接使用window.navigator.msSaveBlob(blob, name)完成下載;
聲明:由于ios系統(tǒng)有安全性限制,以上方法在ios上無效;
以上就是記錄項(xiàng)目中用到的圖片下載,瀏覽器兼容的問題,涉及到的base64和blob的知識(shí)點(diǎn)和原理還不是很清晰,有時(shí)間一定要研究一下,整個(gè)方法,親測(cè)有效;歡迎測(cè)用,與意見反饋。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104230.html
摘要:將預(yù)覽的圖片上傳,后端生成,在管理系統(tǒng)中下載。技術(shù)要點(diǎn)文字排版設(shè)置指定背景顏色引入外部字體繪制文字圖片將生成的圖片轉(zhuǎn)成上傳這里根據(jù)后端協(xié)商,此處后端要求將圖片生成,并點(diǎn)擊批量下載實(shí)現(xiàn)步驟文字排版在一般容器中,如果要實(shí)現(xiàn)文字的排版很容易。 最近遇到一個(gè)業(yè)務(wù)需求,在小程序端定制預(yù)覽功能,并在預(yù)覽的圖片中使用指定的外部字體。將預(yù)覽的圖片上傳OSS,后端生成PDF,在管理系統(tǒng)中下載。但是………...
摘要:支持動(dòng)畫狀態(tài)的,在動(dòng)畫開始,執(zhí)行中,結(jié)束時(shí)提供回調(diào)函數(shù)支持動(dòng)畫可以自定義貝塞爾曲線任何包含數(shù)值的屬性都可以設(shè)置動(dòng)畫倉庫文檔演示功能介紹一定程度上,也是一個(gè)動(dòng)畫庫,適用所有的屬性,并且實(shí)現(xiàn)的能更方便的實(shí)現(xiàn)幀動(dòng)畫,替代復(fù)雜的定義方式。 動(dòng)畫調(diào)研-V1 前言:動(dòng)畫從用途上可以分為兩種,一種是展示型的動(dòng)畫,類似于一張GIF圖,或者一段視頻,另一種就是交互性的動(dòng)畫。這兩種都有具體的應(yīng)用場(chǎng)景,比如...
摘要:上周做一個(gè)關(guān)于移動(dòng)端圖片壓縮上傳的功能。利用,進(jìn)行圖片的壓縮,得到圖片的的值上傳文件。 上周做一個(gè)關(guān)于移動(dòng)端圖片壓縮上傳的功能。期間踩了幾個(gè)坑,在此總結(jié)下。 大體的思路是,部分API的兼容性請(qǐng)參照caniuse: 利用FileReader,讀取blob對(duì)象,或者是file對(duì)象,將圖片轉(zhuǎn)化為data uri的形式。 使用canvas,在頁面上新建一個(gè)畫布,利用canvas提供的API,...
閱讀 1081·2021-11-25 09:43
閱讀 1441·2021-11-18 10:02
閱讀 1893·2021-11-02 14:41
閱讀 2414·2019-08-30 15:55
閱讀 1097·2019-08-29 16:18
閱讀 2583·2019-08-29 14:15
閱讀 1416·2019-08-26 18:13
閱讀 770·2019-08-26 10:27