downloadFile.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * 根据文件url获取文件名
  3. * @param url 文件url
  4. */
  5. function getFileName(url) {
  6. const num = url.lastIndexOf('/') + 1;
  7. let fileName = url.substring(num);
  8. //把参数和文件名分割开
  9. fileName = decodeURI(fileName.split('?')[0]);
  10. return fileName;
  11. }
  12. /**
  13. * 根据文件地址下载文件
  14. * @param {*} sUrl
  15. */
  16. export function downloadByUrl({
  17. url,
  18. target = '_blank',
  19. fileName,
  20. }: {
  21. url: string;
  22. target?: '_self' | '_blank';
  23. fileName?: string;
  24. }): Promise<boolean> {
  25. // 是否同源
  26. const isSameHost = new URL(url).host == location.host;
  27. return new Promise<boolean>((resolve, reject) => {
  28. if (isSameHost) {
  29. const link = document.createElement('a');
  30. link.href = url;
  31. link.target = target;
  32. if (link.download !== undefined) {
  33. link.download = fileName || getFileName(url);
  34. }
  35. if (document.createEvent) {
  36. const e = document.createEvent('MouseEvents');
  37. e.initEvent('click', true, true);
  38. link.dispatchEvent(e);
  39. return resolve(true);
  40. }
  41. if (url.indexOf('?') === -1) {
  42. url += '?download';
  43. }
  44. window.open(url, target);
  45. return resolve(true);
  46. } else {
  47. const canvas = document.createElement('canvas');
  48. const img = document.createElement('img');
  49. img.setAttribute('crossOrigin', 'Anonymous');
  50. img.src = url;
  51. img.onload = () => {
  52. canvas.width = img.width;
  53. canvas.height = img.height;
  54. const context = canvas.getContext('2d')!;
  55. context.drawImage(img, 0, 0, img.width, img.height);
  56. // window.navigator.msSaveBlob(canvas.msToBlob(),'image.jpg');
  57. // saveAs(imageDataUrl, '附件');
  58. canvas.toBlob((blob) => {
  59. const link = document.createElement('a');
  60. link.href = window.URL.createObjectURL(blob);
  61. link.download = getFileName(url);
  62. link.click();
  63. URL.revokeObjectURL(link.href);
  64. resolve(true);
  65. }, 'image/jpeg');
  66. };
  67. img.onerror = (e) => reject(e);
  68. }
  69. });
  70. }