如果你从api获取了一个图片的url,应用 <img> 标签能够轻易的将其展现在页面上,然而你并不需要展现它,而是要下载它,怎么办?
上面给出三种解决办法:
应用 fetch:
export const downloadImage = (imageUrl: string, name: string): void => { fetch(imageUrl, { method: 'get', mode: 'cors', }) .then((response) => response.blob()) .then((data) => { const downloadUrl = window.URL.createObjectURL(new Blob([data])); const link = document.createElement('a'); link.href = downloadUrl; link.setAttribute('download', name); document.body.appendChild(link); link.click(); link.remove(); });};
应用 axios:
export const downloadImage = (imageUrl: string, name: string): void => { axios.get(imageUrl, {responseType: 'blob'}).then((res) => { const downloadUrl = window.URL.createObjectURL(new Blob([res.data])); const link = document.createElement('a'); link.href = downloadUrl; link.setAttribute('download', name); document.body.appendChild(link); link.click(); link.remove(); });};
应用 canvas:
export const downloadImage = (imageUrl: string, name: string): void => { const image = new Image(); image.setAttribute('crossOrigin', 'anonymous'); image.onload = function (): void { console.log(image); const canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; const context = canvas.getContext('2d') as CanvasRenderingContext2D; context.drawImage(image, 0, 0, image.width, image.height); const url = canvas.toDataURL('image/png'); const a = document.createElement('a'); const event = new MouseEvent('click'); a.download = name; a.href = url; a.dispatchEvent(event); }; image.src = imageUrl;};