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

专业技能

一般来说,面试官会根据你的简历内容去提问,但是技术基础还有需要自己去准备分类,形成自己的知识体系的。简单列一下我自己遇到的一些题

最近得空把之前遇到的面试题做了一个整理,包括我本人自己去面试遇到的,还有其他人员去面试遇到的,还有网上刷到的,我都统一的整理了一下,希望对大家有用。

其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器等等

由于文章篇幅有限,仅展示部分内容

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

前言

项目用的是 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);
    });
  }
	function downLoadFile (url){
      let fileName = url.slice(url.lastIndexOf('/') + 1); // 这里是通过从后端获取到的 url 地址中截出来原本的文件名
      fetch(url)
        .then((res) => res.blob())
        .then((blob) => {
          const link = document.createElement('a');
          link.href = URL.createObjectURL(blob);
          // 下载文件的名称及文件类型后缀
          link.download = fileName;
          document.body.appendChild(link);
          link.click();
          //在资源下载完成后 清除 占用的缓存资源
          window.URL.revokeObjectURL(link.href);
          document.body.removeChild(link);
        });
	}
	

2.代码分析

2.1 通过 fetch 将 url 地址转换为 blob 对象

以下图片来自w3cschool文档 fetch_api

在这里插入图片描述

分析

res.blob() 的返回值是什么
从文档中我们知道res.blob() 返回的并不是一个 blob 对象,而是一个 Promise,继续 .then 获取到的才是 blob 对象

res.blob() 到底做了什么
每调用一次 res.blob() 都会执行 consume budy 的动作

学习分享,共勉

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

[外链图片转存中…(img-m5eF2Cp7-1715826648003)]

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用axios来发送POST请求将文件url地址传到后端。具体步骤如下: 1. 在前端页面上,通过input[type=file]元素选择要上传的文件,并使用FileReader对象读取文件内容,将文件内容转换成base64编码的字符串。 2. 将base64编码的字符串发送到后端后端将其解码成文件并保存。 下面是一个示例代码: ``` // HTML <input type="file" @change="onFileChange"> // JS import axios from 'axios' export default { methods: { async onFileChange(event) { const file = event.target.files[0] const reader = new FileReader() reader.onload = async (e) => { const content = e.target.result const formData = new FormData() // 将base64编码的字符串转换成Blob对象 const blob = await fetch(content).then(r => r.blob()) formData.append('file', blob, file.name) // 发送POST请求将文件上传到后端 await axios.post('/api/upload', formData) } reader.readAsDataURL(file) } } } ``` 在后端,使用类似以下的代码来接收文件: ``` const express = require('express') const multer = require('multer') const app = express() const upload = multer({ dest: 'uploads/' }) app.post('/api/upload', upload.single('file'), (req, res) => { console.log(req.file) // { fieldname: 'file', originalname: 'example.png', encoding: '7bit', mimetype: 'image/png', destination: 'uploads/', filename: 'a7579eb4ebf3bce4bbd7e41a26c6eacb', path: 'uploads/a7579eb4ebf3bce4bbd7e41a26c6eacb', size: 1000 } res.send('File uploaded successfully') }) app.listen(3000, () => console.log('Server started')) ``` 在上面的示例,我们使用multer库来处理文件上传。multer将上传的文件保存在指定的目录下,并将文件信息存储在req.file对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值