当前位置:   article > 正文

使用浏览器实现下载的几种方式_iframe下载文件

iframe下载文件

方式一:使用 a 标签实现下载

  1. component.js
  2. downLoadFile(item: LogList) {
  3. this.exportTipId = this.msgSrv.success('导出成功', { nzDuration: 1200 }).messageId;
  4. const url = `${window.location.protocol}//${window.location.hostname}:${window.location.port}${window.location.pathname}${this.settings.app.SERVER_URL}/watson/bs/asyncExportDownload?attachmentId=${item.attachmentId}&groupId=${item.leId}`;
  5. downloadFile(url, item.comments);
  6. this.matomoTracker.trackEvent('流水文件', 'Downloaded', item.comments);
  7. }
  8. /* 下载文件
  9. */
  10. export function downloadFile(url, fileName = '') {
  11. let eleLink = document.createElement('a');
  12. if (fileName) {
  13. eleLink.download = fileName;
  14. }
  15. eleLink.style.display = 'none';
  16. eleLink.href = url;
  17. // 受浏览器安全策略的因素,动态创建的元素必须添加到浏览器后才能实施点击
  18. document.body.appendChild(eleLink);
  19. // 触发点击
  20. eleLink.click();
  21. // 然后移除
  22. document.body.removeChild(eleLink);
  23. }

方式二:使用 iframe 标签实现下载

  1. downLoadFile(item: LogList) {
  2. this.exportTipId = this.msgSrv.loading('正在导出流水', { nzDuration: 0 }).messageId;
  3. const params = { attachmentId: item.attachmentId, groupId: item.leId };
  4. const url = `${this.settings.app.SERVER_URL}/watson/bs/asyncExportDownload?${queryToString(params)}`;
  5. downloadFile(url, item.comments).then(res => {
  6. this.msgSrv.remove(this.exportTipId);
  7. this.msgSrv.success('导出成功', { nzDuration: 1200 });
  8. this.matomoTracker.trackEvent('流水文件', 'Downloaded', item.comments);
  9. });
  10. }
  11. utils.js
  12. // 下载方法
  13. export function downloadFile(urlValue: string, fileName = '') {
  14. const url = `${window.location.protocol}//${window.location.hostname}:${window.location.port}${window.location.pathname}${urlValue}`;
  15. let iframe = document.createElement('iframe');
  16. iframe.src = url;
  17. iframe.style.display = 'none';
  18. iframe.name = fileName;
  19. document.body.appendChild(iframe);
  20. return new Promise((resolve, reject) => {
  21. const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
  22. if (iframeDoc.readyState === 'complete' || iframeDoc.readyState === 'interactive') {
  23. resolve(true);
  24. }
  25. });
  26. }
  27. // 处理get请求的字段拼接方法 ?page=xxx&pageSize=xxx
  28. export function queryToString(query = {}) {
  29. const encode = encodeURIComponent;
  30. return Object.keys(query)
  31. .map(key => `${encode(key)}=${encode(query[key])}`)
  32. .join('&');
  33. }
  34. iframe下载参考连接:https://www.jianshu.com/p/ac542c8f3775

方式三:使用http调用后端接口,后端返回头中增加字段 Content-Length,然后接口返回的下载参数与 Content-Length 进行百分比换算来显示下载进度。

  1. component.ts
  2. this.service.exportDownload(params).subscribe(data => {
  3. // progress
  4. if (data.type === HttpEventType.DownloadProgress) {
  5. // loaded已经下载完/total下载总数 也就是后端返回的Content-Length
  6. this.downloadPercent = data.loaded / data.total;
  7. }
  8. // finished
  9. if (data.type === HttpEventType.Response) {
  10. this.fileSaver.save(data.body, item.comments);
  11. this.msgSrv.remove(this.exportTipId);
  12. this.msgSrv.success('导出成功', { nzDuration: 1200 });
  13. this.matomoTracker.trackEvent('流水文件', 'Downloaded', item.comments);
  14. this.isDownloadId = null;
  15. }
  16. });
  17. service.js
  18. // 导出流水
  19. exportDownload(params: ExportParams): Observable<any> {
  20. return this.http
  21. .get(`/watson/bs/asyncExportDownload`, params, {
  22. responseType: 'blob',
  23. reportProgress: true, // 打开返回进度的显示
  24. observe: 'events', // 来查看所有事件,包括传输的进度。
  25. headers: new HttpHeaders({ 'Content-Type': 'application/json' })
  26. })
  27. .pipe(map(data => data));
  28. }

参考连接:

angular使用post下载流文件:Angular使用HTTP POST下载流文件_GuoyeZhang的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/63559
推荐阅读
相关标签
  

闽ICP备14008679号