vue3,下载预览的四种方法之responseType-blob、fileName、a标签下载& axio ...

打印 上一主题 下一主题

主题 1040|帖子 1040|积分 3120

vue3,下载预览的四种方法之responseType-blob、fileName、a标签下载& axios之post哀求写法& 引入js方法文件写法& try和catch、async和await用法

页面


1.1、按钮下载页面

index.vue
  1. <div>
  2.     <el-button type="primary" @click="handelDowload">下载预览</el-button>
  3. </div>
  4. <script lang="ts" setup>
  5. import axios from "axios";
  6. import { downLoadxls } from "@/utils/utils.js";
  7. // 下载预览
  8. const handelDowload = () => {
  9.     axios({ method: 'POST', url: process.env.VUE_APP_API_HOST + constant.ieopCollaborate + '/collaborate/directory/content/downloadPDF', data: { id: directoryId }, responseType: 'blob' }).then((res) => {
  10.         if (res.data?.code) {
  11.             ElMessage.error(res.data.message)
  12.         } else {
  13.             downLoadxls(res)
  14.             setTimeout(function () {
  15.                 ElMessage.success("下载成功")
  16.             }, 1000)
  17.         }
  18.     })
  19. }
  20. </script>
复制代码
包含4个参数:


  • 哀求方式method:POST
  • 哀求地点url:url
  • 哀求参数data:data
  • 定义类型responseType
浏览器下载结果图

1.2、表格附件下载页面

index.vue
  1. <el-table-column align="center" label="相关附件" prop="fileName">
  2.       <template #default="scope">
  3.            <span style="color: #409eff; cursor: pointer"
  4.                                 @click="handelDowload(scope.row)">{{scope.row.fileName}}</span>
  5.       </template>
  6. </el-table-column>
复制代码
1.3、引入的方法文件

src\utils\utils.js
  1. //文件流导出数据处理 方式一
  2. export function downLoadxls(res, fileName) {
  3.   let name;
  4.   if (fileName) {
  5.     name = fileName;
  6.   } else {
  7.     if (res.headers["content-disposition"]) {
  8.       const contentDisposition = res.headers["content-disposition"].split("=");
  9.       name = (contentDisposition && decodeURI(contentDisposition[1])) || "";
  10.     }
  11.   }
  12.   const file = new File([res.data], res.data);
  13.   const href = URL.createObjectURL(file);
  14.   const aTag = document.createElement("a");
  15.   aTag.download = name;
  16.   aTag.target = "_blank";
  17.   aTag.href = href;
  18.   aTag.click();
  19.   URL.revokeObjectURL(href);
  20. }
  21. //文件流导出数据处理 方式二
  22. export function downLoad(res, fileName) {
  23.   let name;
  24.   if (fileName) {
  25.     name = fileName;
  26.   } else {
  27.     if (res.headers["content-disposition"]) {
  28.       const contentDisposition = res.headers["content-disposition"].split("=");
  29.       name = (contentDisposition && decodeURI(contentDisposition[1])) || "";
  30.     }
  31.   }
  32.   const content = res.data
  33.   const blob = new Blob([content])
  34.   const elink = document.createElement('a')
  35.   elink.download = name
  36.   elink.style.display = 'none'
  37.   elink.href= URL.createObjectURL(blob)
  38.   document.body.appendChild(elink)
  39.   elink.click()
  40.   URL.revokeObjectURL(elink.href)
  41.   document.body.removeChild(elink)
  42. }
复制代码
2、直接使用接口下载的页面

index.vue
  1. <el-table-column align="center" label="相关附件" prop="fileName">
  2.                         <template #default="scope">
  3.                             <span style="color: #409eff; cursor: pointer"
  4.                                 @click="handelDowload(scope.row)">{{scope.row.fileName}}</span>
  5.                         </template>
  6.                     </el-table-column>
  7. <script lang="ts" setup>
  8. import axios from '@/utils/request'
  9. // import axios from 'axios'
  10. const handelDowload = (row: any) => {
  11.     console.log(row);
  12.         axios({ method: 'POST', url: process.env.VUE_APP_API_HOST + constant.fileUpload + '/download?id=' + file.fileId, responseType: 'blob' })
  13.     .then(result => {
  14.         const content = result.data
  15.         const blob = new Blob([content])
  16.         const fileName = file.fileName
  17.         if ('download' in document.createElement('a')) {
  18.             const elink = document.createElement('a')
  19.             elink.download = fileName
  20.             elink.style.display = 'none'
  21.             elink.href = URL.createObjectURL(blob)
  22.             document.body.appendChild(elink)
  23.             elink.click()
  24.             URL.revokeObjectURL(elink.href)
  25.             document.body.removeChild(elink)
  26.         } else {
  27.             navigator.msSaveBlob(blob, fileName)
  28.         }
  29.     })
  30. }   
  31. </script>
复制代码
3、a标签下载文件

index.vue
  1. <div class="info_file">
  2.   <span class="title_file">附件:</span>
  3.   <span class="text_file">
  4.     <span class="fileName" v-for="item in fileList" :key="item.fileId" @click="downloadFile(item.fileId,item.fileName)">{{ item.fileName }}</span>
  5.   </span>
  6. </div>
  7. <div class="info">
  8.     <div class="title">资质文件:&nbsp;&nbsp;</div>
  9.     <div class="text">
  10.         <div style="cursor: pointer;color:#409eff"
  11.             v-for="item in projOrganizationPatentInfo.qualificationFileVoList" :key="item.id"
  12.             @click="_downloadFileWater(item.id, item.fileName)">
  13.             <Link style="width: 1em; height: 1em; margin-right: 8px;margin-top: 3px" />{{
  14.                 item.fileName }}
  15.         </div>
  16.     </div>
  17.    
  18. <span class="span-btn" @click="docDownload(row)" >生成交易函</span>   
  19. </div>
  20. <script>
  21. import { downloadFileApi,downloadFileWaterApi,wordTemplateExportApi } from "@/api/file";
  22. import { uploadFileByA } from "@/utils/tool";
  23.    
  24. // 点击下载附件
  25. async downloadFile(fileId,fileName){
  26.   try {
  27.       let result = await downloadFileApi(fileId)
  28.       if(result.data.size){
  29.         uploadFileByA(result.data,fileName)
  30.       }else{
  31.         this.message.error('下载合同失败,请重试')
  32.       }
  33.   } catch (error) {
  34.       console.log(error)
  35.   }
  36. },
  37.    
  38. // 下载水印附件
  39. const _downloadFileWater=async (id,fileName)=>{
  40.     try {
  41.         let params = {id:id}
  42.         let result = await downloadFileWaterApi(params)
  43.         if (result.status == 200) {
  44.             uploadFileByA(result.data,fileName)
  45.         }
  46.     } catch (error) {
  47.         console.log(error)
  48.     }
  49. }
  50. // 模板文件下载
  51. async docDownload(row){
  52.     try {
  53.         let params = {
  54.             projNo:this.projNo,
  55.             patentProjectId:row.id,
  56.             exportType:1
  57.         }
  58.         console.log(params)
  59.         let result = await wordTemplateExportApi(params)
  60.         if(result.data.size){
  61.             uploadFileByA(result.data,`交易函模板.docx`)
  62.         }else{
  63.             this.message.error('交易函模板下载失败,请重试')
  64.         }
  65.     } catch (error) {
  66.         console.log(error)
  67.     }
  68. },
  69. </script>
  70. <style lang="scss" scoped>
  71. .info_file{
  72.   display: flex;
  73.   .title_file{
  74.     width: 70px;
  75.     flex-shrink: 0;
  76.     display: inline-block;
  77.     text-align: right;
  78.     vertical-align: top;
  79.   }
  80.   .text_file{
  81.     display: inline-block;
  82.     .fileName{
  83.       display: block;
  84.       cursor: pointer;
  85.     }
  86.   }
  87. }
  88.    
  89. .info {
  90.     width: 100%;
  91.     margin-bottom: 20px;
  92.     display: flex;
  93.     color: #666;
  94.     .title {
  95.         width: 15%;
  96.         text-align: right;
  97.         font-weight: bold;
  98.     }
  99.     .text {
  100.         font-size: 14px;
  101.         width: 85%;
  102.         text-align: left;
  103.         white-space: pre-wrap;
  104.         color: #535353;
  105.     }
  106. }
  107.    
  108. .span-btn {
  109.     font-size: 12px;
  110.     display: block;
  111.     color: #409EFF;
  112.     cursor: pointer;
  113. }   
  114. </style>
复制代码
src\utils\tool.js
  1. // a标签下载文件
  2. /**
  3. * @param {content} 文件流信息
  4. * @param {fileName} 附件名称
  5. */
  6. export function uploadFileByA(content,fileName){
  7.   const blob = new Blob([content])
  8.   if('download' in document.createElement('a')){
  9.       const elink = document.createElement('a')
  10.       elink.download = fileName
  11.       elink.style.display = 'none'
  12.       elink.href= URL.createObjectURL(blob)
  13.       document.body.appendChild(elink)
  14.       elink.click()
  15.       URL.revokeObjectURL(elink.href)
  16.       document.body.removeChild(elink)
  17.   }else{
  18.       navigator.msSaveBlob(blob,fileName)
  19.   }
  20. }
复制代码
src\api\file.js
  1. import axios from '@/utils/request'
  2. import { getApiUrl } from "@/utils/tool";
  3. import  constant  from "@/components/constant";
  4. const baseUrl = getApiUrl();
  5. // 下载附件
  6. export const downloadFileApi = (id)=>{
  7.     return axios({
  8.         method:'get',
  9.         url:baseUrl + constant.fileUpload + '/download?id=' + id,
  10.         responseType:'blob'
  11.     })
  12. }
  13. // 下载水印附件
  14. export const downloadFileWaterApi = (params)=>{
  15.     return axios({
  16.         method:'post',
  17.         url:baseUrl + constant.publicCoop + '/mark/file/download',
  18.         data:params,
  19.         responseType:'blob'
  20.     })
  21. }
  22. // 合同模板下载
  23. /**
  24. *
  25. * @param {projNo:项目编号;exportType:0、交易方案  1、交易鉴证函   2、交易通知书} data
  26. * @returns
  27. */
  28. export const wordTemplateExportApi = (data)=>{
  29.     return axios({
  30.         method:'post',
  31.         // url:'http://27.196.111.34:18080/ieop-pri-property1/word/export',
  32.         url:baseUrl + constant.intellectual + '/word/export',
  33.         responseType:'blob',
  34.         data
  35.     })
  36. }
复制代码
src\utils\tool.js
  1. export function getApiUrl(v) {
  2.   return process.env.VUE_APP_API_HOST
  3. }
复制代码
src\components\constant.js
  1. /**
  2. * Created by author on 2023/12/18.
  3. */
  4. export default {
  5.   intellectual:'/ieop-pri-property', //3知识产权网关标识
  6.   fileUpload:'/yundu-file-wjm', //1知识产权上传文件网关
  7.   publicCoop: "/ieop-mtg-coop", // 2公共网关标识
  8.   ieopCollaborate: "/ieop-mtg-collaborate", // 在线协作网关标识
  9. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表