vue 中从后端获取到文件的 url 地址,前端根据 url 地址下载文件

文章介绍了在Vue项目中,如何利用fetch将后端提供的文件URL转换为blob对象,再通过URL.createObjectURL生成下载链接,最后利用<a>标签实现文件下载。主要涉及fetchAPI,blob对象,以及URL对象的使用,并强调了资源释放的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

项目用的是 vben admin 框架,用的是 vue3 + TS
项目需求数据导出功能,前端需要实现文件下载功能
后端返回的是文件的 url 地址 (本项目中返回的是阿里云 oss 的文件地址)


一、实现思路

从后端得到的是一个 url 地址,先通过 fetch api 请求这个 url 地址并转换成 blob 对象,通过 URL.createObjectUrl() 将 blob 对象生成 url 地址,绑定到 <a > 标签 的 href 属性上面,结合 download 来实现点击 <a > 标签下载文件

二、具体实现

1.完整代码

代码如下:

  function exportData() {
   
   
    let data = getForm().getFieldsValue();
    exportTowerHistoryToExcel({
   
    deviceId, createTime: data.startTime }).then((url) => {
   
   
	    downLoadFile(url);
    });
  
### Vue.js 中实现文件预览与下载 为了实现在 Vue.js 应用中从前端预览并下载后端提供的文件,可以采用 `docx-preview` 和 `jszip` 插件来处理 Word 文件的展示。安装所需依赖可以通过 npm 完成: ```bash npm i docx-preview@0.1.4 npm i jszip ``` 在组件内部引入这两个库,并编写相应的方法用于触发文件请求以及渲染预览界面。 #### 组件模板部分 定义一个简单的按钮用来发起获取文档的动作,同时预留一块区域作为预览容器。 ```html <template> <div class="preview-container"> <!-- 预览区 --> <section id="filePreview"></section> <!-- 下载/加载按钮 --> <button @click="fetchDocument">点击加载Word文档</button> </div> </template> ``` #### 方法逻辑实现 通过 Axios 或者 Fetch API 向服务器发送 GET 请求以二进制流的形式接收目标文件,在成功回调里利用 Blob 对象保存响应体内容;接着调用 `URL.createObjectURL()` 函数生成临时 URL 地址供 `<iframe>` 或其他 HTML 元素加载显示[^1]。 对于特定类型的 Office 文档如 .docx,则可以直接借助于之前提到过的第三方类库完成解析工作。 ```javascript <script setup> import { ref } from 'vue'; import axios from 'axios'; import DocxPreview from 'docx-preview'; const fetchDocument = async () => { try { const response = await axios({ url: '/api/get-word-file', // 替换成实际接口地址 method: 'GET', responseType: 'blob' // 设置响应类型为 blob }); let fileUrl; if (response.headers['content-type'] === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') { // 使用 docx-preview 处理 docx 文件 const containerElement = document.getElementById('filePreview'); while (containerElement.firstChild) { containerElement.removeChild(containerElement.lastChild); } new DocxPreview(response.data, {}, containerElement); } else { // 创建对象url以便浏览器能够访问到该资源 fileUrl = window.URL.createObjectURL(new Blob([response.data])); // 如果是非 docx 类型则考虑嵌入 iframe 进行简单查看 const previewFrame = document.createElement('iframe'); previewFrame.src = fileUrl; previewFrame.style.width = "100%"; previewFrame.style.height = "600px"; document.querySelector('#filePreview').appendChild(previewFrame); } } catch(error){ console.error("Failed to load the document", error); } }; </script> ``` 此代码片段展示了如何基于不同 MIME 类型选择合适的呈现方式。对于 `.docx` 格式的文件特别采用了专门针对此类格式优化后的 JavaScript 解析器来进行更友好的可视化操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值