Prefácio: A função de download de imagem precisa ser implementada no projeto A primeira coisa que vem à mente é usar o atributo download da tag a para alcançá-la. Porém, ao testar em diferentes navegadores, será descoberto que alguns navegadores. são inválidos e visualizarão a imagem diretamente após clicar. Portanto, encontrei outro método para baixar imagens que é compatível com diferentes navegadores, que é usar o canvas para processar imagens e baixá-las;
1. Clique em vinculação de eventos no projeto:
<a href=# @click.prevent=downloadIamge(imgsrc, name)><span>{{name}}</span></a>
2. Operação em evento click:
downloadIamge (imgsrc, nome) { const url = imgsrc this.convertUrlToBase64(url).then((base64) => { const blob = this.convertBase64UrlToBlob(base64) if (getBrowser() === 'IE' || getBrowser( ) === 'Edge') { window.navigator.msSaveBlob(blob, nome) } else { const a = document.createElement('a') const body = document.querySelector('body') a.download = nome || 'image' a.href = URL.createObjectURL(blob) a.style.display = ' nenhum' body.appendChild(a) a.click() body.removeChild(a) window.URL.revokeObjectURL(a.href) } }) },
3.this.convertUrlToBase64(url) usa canvas e toDataURL para converter a imagem no formato base64 e retorná-la
convertUrlToBase64 (url) { return new Promise((resolver, rejeitar) => { const img = new Image() img.crossOrigin = 'Anônimo' 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, tipo: 'image/' + ext, ext: ext } resolve(base64) } }) },
Entre eles: img.crossOrigin = 'Anonymous' é o processamento de imagens entre domínios pelo front end;
4.this.convertBase64UrlToBlob(base64) converte o arquivo de fluxo base64 da imagem em um arquivo 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 (seja i = 0; i < rawLength; i++) { uInt8Array[i] = raw.charCodeAt(i) } retornar novo Blob([uInt8Array], { tipo: contentType }) },
5.getBrowser() é usado para determinar o navegador e resolver problemas de compatibilidade do navegador:
import { getBrowser } from '@/utils/utils'export function getBrowser () { const userAgent = navigator.userAgent if (userAgent.indexOf('OPR') > -1) { return 'Opera' } if (userAgent.indexOf( 'Firefox') > -1) { retornar 'FF' } if (userAgent.indexOf('Trident') > -1) { retornar 'IE' } if (userAgent.indexOf('Edge') > -1) { return 'Edge' } if (userAgent.indexOf('Chrome') > -1) { return 'Chrome' } if (userAgent.indexOf('Safari' ) > -1) { retornar 'Safari' }}
6. Se for um navegador IE ou Edge, você pode usar diretamente window.navigator.msSaveBlob(blob, name) para concluir o download;
Isenção de responsabilidade: devido a restrições de segurança no sistema iOS, o método acima é inválido no iOS;
O acima é o problema de download de imagens e compatibilidade do navegador usado no projeto de gravação. Os pontos de conhecimento e princípios envolvidos em base64 e blob ainda não são muito claros. ; bem-vindo para testá-lo e feedback. Também espero que todos apoiem a Rede VeVb Wulin.