页面路由跳转 - 文件 File对象数据传递

news2024/11/19 9:23:57

目录

  • 需求
  • 主要问题点
    • 问题点2.1 演示
    • 问题点2.2 演示及解决
      • `页面B` 处理1 - 有问题
      • `页面B` 处理2 - 没有问题 - 最终解决办法
    • 【补充】 file 对象转为 base64 文件(即 将 file 对象转为 DataURL)

需求

页面A填写完信息(填写的信息中有上传的文件)之后需要跳转到页面B签名,然后在页面B内将填写的信息(包括上传的文件)和签名图片一起调用接口上传。

主要问题点

  1. 页面A 跳转到 页面B 需要携带页面A填写的信息(包括上传的文件 fileList 以及 其中File对象)
  2. this.$router.push() 通过 query 传参 fileList(两种方法主要是用不用 JSON.parse() 处理的区别):
    2.1 文件列表 fileList 直接携带:跳转到页面B可以取到其中的 file ,【但是】页面刷新之后就没有了(详见下问题2.1演示)
    2.2 文件列表 fileList 通过 JSON.parse() 转换携带:跳转到页面B JSON.stringify() 后fileList中的 file 为空 (详见下问题2.2演示及解决)
    【最终解决】问题点2.2 演示及解决:页面A + 页面B 处理2

【注】
在这里插入图片描述

问题点2.1 演示

页面A

// 路由跳转
this.$router.push({
  path: '/sign', // 跳转到签名的路由
  query: {
    // ...
    fileList: this.fileList, // 当前页面上传的文件需要在签名页面调接口和签名的图片一起上传
  }
})

页面B

 this.fileList = this.$route.query.fileList

页面 B 直接取 $route.query 中 fileList,file对象信息存在,没有问题
在这里插入图片描述

刷新页面后出现问题:
在这里插入图片描述

问题点2.2 演示及解决

页面A

this.fileList.forEach(async item => {
  // console.log('item----', item)
  // const base64 = await this.file2DataURL(item.file) // 此处不需要
  // item.content = base64
  item.filename = item.file.name // 接口上传文件时需要文件名,否则接口会报错
})
// 路由跳转
this.$router.push({
  path: '/sign', // 跳转到签名的路由
  query: {
    // ...
    fileList: JSON.stringify(this.fileList), // 当前页面上传的文件需要在签名页面调接口和签名的图片一起上传
  }
})

页面B 处理1 - 有问题

this.fileList = JSON.parse(this.$route.query.fileList || '[]')

页面B JSON.parse(this.$route.query.fileList || '[]') 处理后,file 对象丢失
在这里插入图片描述

页面B 处理2 - 没有问题 - 最终解决办法

import { dataURLtoFile } from '@/utils/index.js'

this.fileList = JSON.parse(this.$route.query.fileList || '[]')
this.fileList.forEach(item => {
  const File = dataURLtoFile(item.content, item.filename, 'image/png') // 【主要代码 - 重点】将base64格式文件转为 file对象
  item.file = File
})

页面B 中将页面A传过来的 base64 格式文件转为 file 对象
在这里插入图片描述

@/utils/index.js

/**
 * 将 base64 转换为 file 对象
 *    dataURL:base64 格式
 *    fileName:文件名
 *    fileType:文件格式
 */
export function dataURLtoFile(dataURL, fileName, fileType) {
  const arr = dataURL.split(',')
  const mime = arr[0].match(/:(.*?);/)[1]
  const bstr = atob(arr[1])
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], fileName, { type: fileType || 'image/jpg' })
}

【补充】 file 对象转为 base64 文件(即 将 file 对象转为 DataURL)

以上 问题点2.2 演示及解决 - 页面A 中我的 fileList 数据中有文件的 base64 格式,就可以直接传到页面B将该 base64 转为 file 对象。
如果自己的数据中没有 base64 格式的话,需要:将 页面A 中 file 对象转为 base64 格式 → 页面A将base64数据通过路由的 query 传到页面B → 页面B 接收到base64数据 → 再将 base64 转为 file 对象

file 对象转为 base64 文件
页面A

this.fileList.forEach(async item => {
  // console.log('item----', item)
  const base64 = await this.file2DataURL(item.file) // 【主要代码】
  item.content = base64
  item.filename = item.file.name // 接口上传文件时需要文件名,否则接口会报错
})
// 路由跳转
this.$router.push({
  path: '/sign', // 跳转到签名的路由
  query: {
    // ...
    fileList: JSON.stringify(this.fileList), // 当前页面上传的文件需要在签名页面调接口和签名的图片一起上传
  }
})

// 【主要代码】file 对象转为 base64 文件(即 将 file 对象转为 DataURL)
file2DataURL(file) {
  return new Promise(resolve => {
    const reader = new FileReader()
    reader.onload = () => {
      resolve(reader.result)
    }
    reader.readAsDataURL(file)
  })
},

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统 —— 处理机调度与死锁

(一)简答题 1.高级调度与低级调度的主要任务是什么?为什么要引人中级调度? 参考答案: ①高级调度的对象是作业。它的主要任务是根据某种算法,决定 将外存上处于后备队列中的哪几个作业调入内存&#xff0c…

SW中的面部曲线命令

今天学习老王的画图教程中看到在使用面部曲线命令,找了变天没有,于是开始四处查找模式,终于在一个视频中看到了,原来不是在曲面命令中,而是在草图命令中,老王为了迷惑学员,把这个面部曲线命令放…

vite+vue3.0 使用tailwindcss

参考资料: 安装 - TailwindCSS中文文档 | TailwindCSS中文网 npm install -D tailwindcss npm install postcss npm install autoprefixer npx tailwindcss init -p 生成/src/tailwind.config.js和/src/postcss.config.js配置文件 在/src/tailwind.config.js配置文件…

【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持

随着建筑行业的快速发展,建筑施工安全问题日益受到广泛关注。然而,传统的安全培训方式往往缺乏实践性和真实性,难以让员工真正掌握安全操作技能。近年来,虚拟现实(VR)技术的广泛应用为建筑施工安全培训提供了新的机遇。 虚拟现实技…

私有化部署助力企业信息安全,WorkPlus助您完美替代企微、钉钉、飞书!

在企业通讯领域,企业微信、钉钉和飞书等平台早已成为众多企业的首选。然而,对于一些企业来说,依赖公有云平台带来的数据安全和隐私问题仍然是一个隐患。因此,越来越多的企业开始关注私有化部署的解决方案。而在这个领域&#xff0…

JAVA转GO

GO 环境配置 go环境 下载go并安装(win下),环境变量他自己要配置上 https://dl.google.com/go/go1.21.3.windows-amd64.msi 验证是否安装成功: //打开cmd go versionVSCODE环境 下载VSCODE…略 配置VSCODE的环境 下载插件 go开发工具包 打开cmd,或者VSCODE自带的终端,…

OFDM基本原理

一、OFDM简述 OFDM 的全称是 Orthogonal Frequency Divisition Multiplexing,是一种多载波调制技术,其能有效对抗频率选择性衰落,克服信号符号间干扰。OFDM的技术的核心思想是将宽频率载波划分成多个带宽较小的正交子载波,并使用这…

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序

2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现: 美国总统选举每四年举行一次。 2020年是美国总统大选年,共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易,经济金融治理,…

【嵌入式开发问答】不是普通的嵌入式八股

1. 进程、线程、堆栈、溢出 【问:】 进程的堆栈的物理内存是什么时候分配的? 堆栈的大小限制是多大?这个限制可以调整吗? 当堆栈发生溢出后应用程序会发生什么? 【答:】

七个开发者不可不知的VS Code小技巧

本文就来分享 7 个极大提高开发效率的 VS Code 技巧! 目录 1.固定滚动(Sticky Scroll) 2.命令面板(Command Palette) 3.自定义代码片段(Custom Snippets) 4.文件查找(File Finde…

软件测试方法分类

软件测试方法种类繁多,有白盒测试、黑盒测试、静态测试、动态测试、集成测试等等,记忆起来容易混乱,傻傻分不清楚,如果把软件测试方法进行分类, 就会清晰很多。现在小峰把常用的软件测试方法列出来,让大家更容易区分记…

百度发布文心大模型4.0,百度搜索实现重构;AI报告2023

🦉 AI新闻 🚀 百度发布文心大模型4.0,百度搜索实现重构 摘要:10月17日,百度创始人李彦宏在百度世界2023上发布了文心大模型4.0,并开启邀请测试。这是迄今为止最强大的文心大模型,提升了理解、…

vue 自定义指令 -- 指令的值

vue 自定义指令 – 指令的值 **创建 工程: H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\05-自定义指令-指令的值 vue --vers…

HarmonyOS 语言基础类库开发指南上线啦!

语言基础类库提供哪些功能?多线程并发如何实现?TaskPool(任务池)和 Worker 在实现和使用场景上有何不同? 针对开发者关注的并发等语言基础类库的相关能力,我们在新推出的语言基础类库开发指南中提供了详细的…

pip报failed to create process

使用pip命令的时候报failed to create process 1、错误提示窗口如下图 2、报这个错误的原因,是因为你改动了python的目录名称或位置。因为,我的电脑是安装了anaconda2和anaconda3的,我想让python2和python3共存,就将anaconda2和a…

一些前端面试思考

回流和重绘 先牢记这句话,回流必将引起重绘,而重绘不一定会引起回流。回流的代价要远大于重绘。 当你给一个元素更换颜色,这样的行为是不会影响页面布局的,DOM树不会变化,但颜色变了,渲染树得重新渲染页面&…

可以充当销售的高品质画册是怎么制作的?

一本优秀的宣传画册就如同一个销售员,具有卓越的灵魂,可以让人达到赏心悦目的视觉效果。如何做出这种高品质的宣传画册呢? 其实很简单,FLBOOK里面汇集了各种各样的宣传画册模板 ,只需一键套用模板制作,你也…

算法通过村第十五关-超大规模|白银笔记|经典问题

文章目录 前言从40个亿中产生一个不存在的整数位图存储数据的原理使用10MB来存储如何确定分块的区间 用2GB内存在20亿的整数中找到出现次数最多的数从100亿个URL中查找的问题40亿个非负整数中找出两次的数。总结 前言 提示:人生之中总有空白,但有时&…

2023年安徽省安全员C证证模拟考试题库及安徽省安全员C证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年安徽省安全员C证证模拟考试题库及安徽省安全员C证理论考试试题是由安全生产模拟考试一点通提供,安徽省安全员C证证模拟考试题库是根据安徽省安全员C证最新版教材,安徽省安全员C证大纲整理…

idea中还原dont ask again

背景 在使用idea打开另外一个项目的时候,一不小心勾选为当前项目而且是不在下次询问,导致后面每次打开新的项目都会把当前项目关闭,如下图所示 下面我们就一起看一下如何把这个询问按钮还原回来 preferences/settings->Appearance&…