Предисловие: В проекте необходимо реализовать функцию загрузки изображений. Первое, что приходит на ум, — это использовать для этого атрибут загрузки тега. Однако при тестировании в разных браузерах будет обнаружено, что некоторые браузеры не работают. недействительны и будут осуществлять предварительный просмотр изображения после нажатия. Поэтому я нашел другой способ загрузки изображений, совместимый с различными браузерами, а именно использование холста для обработки изображений и их загрузки;
1. Нажмите привязку событий в проекте:
<a href=# @click.prevent=downloadIamge(imgsrc, name)><span>{{name}}</span></a>
2. Операция по событию щелчка:
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 для преобразования изображения в формат base64 и его возврата.
ConvertUrlToBase64 (url) { return new Promise((resolve, ignore) => { 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, введите: 'image/' + ext, ext: ext }solve(base64) } }) },
Среди них: img.crossOrigin = 'Anonymous' — междоменная обработка изображений фронтендом;
4.this.convertBase64UrlToBlob(base64) преобразует файл потока изображения base64 в файл больших двоичных объектов.
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 (пусть 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) { вернуть «Сафари» }}
6. Если это браузер IE или Edge, вы можете напрямую использовать window.navigator.msSaveBlob(blob, name) для завершения загрузки;
Отказ от ответственности: из-за ограничений безопасности в системе iOS описанный выше метод недействителен в iOS;
Вышеописанная проблема связана с загрузкой изображений и совместимостью браузеров, используемых в проекте записи. Знания и принципы, связанные с base64 и blob, еще не очень ясны. Вы должны изучить это, когда у вас будет время. Весь метод эффективен при личном тестировании. ; добро пожаловать на тестирование и обратную связь. Я также надеюсь, что все поддержат сеть VeVb Wulin.