当前位置: 首页 > news >正文

react将文件转为base64进行上传

需求

图片、pdf、word、excel等文件进行上传。图片、pdf等调接口A、word、excel等附件调接口B。接口关于文件是base64格式的参数

业务场景

上传资源,区分影像与附件

逻辑思路

  1. 使用原生input标签,type='file',进行上传
  2. 上传后的回调,对文件进行分类,影像与附件
  3. 对文件进行base64编码
  4. 执行接口进行上传

代码实现

  1. 点击input进行上传,选择文件后执行onChange回调
<inputtype="file"multipleref={uploadInputRef}onChange={uploadFileOnChange}/>
  1. 对文件进行分类,我这里是通过type去判断的
export const uploadFileOnChange = async (e: ChangeEvent<HTMLInputElement>) => {const files = e.target.files;// 将影像以及附件分类const images: File[] = [];const attachments: File[] = [];for (const iterator of files ?? []) {if (iterator.type.includes('sheet') ||iterator.type.includes('excel') ||iterator.type.includes('csv') ||iterator.type.includes('word')) {attachments.push(iterator);} else {images.push(iterator);}}
};
  1. 对文件进行base64编码
async function readFileAsDataURL(file: Blob) {const result_base64 = await new Promise<string>((resolve) => {const fileReader = new FileReader();fileReader.readAsDataURL(file);fileReader.onload = () =>typeof fileReader.result === 'string' && resolve(fileReader.result);});return result_base64.split('base64,')[1];
}export const uploadFileOnChange = async (e: ChangeEvent<HTMLInputElement>) => {const files = e.target.files;// 将影像以及附件分类const images: File[] = [];const attachments: File[] = [];for (const iterator of files ?? []) {if (iterator.type.includes('sheet') ||iterator.type.includes('excel') ||iterator.type.includes('csv') ||iterator.type.includes('word')) {attachments.push(iterator);} else {images.push(iterator);}}const imageData: ImageData[] = [];const affixData: AffixData[] = [];for (const i of images) {const imgBase64 = await readFileAsDataURL(i);imageData.push({name: i.name,imgBase64,});}for (const i of attachments) {const affixBase64 = await readFileAsDataURL(i);affixData.push({name: i.name,affixBase64,});}return {imageData,affixData,};
};
  1. 拿到上一步返回的数据调接口
http://www.lryc.cn/news/154654.html

相关文章:

  • 生成式人工智能能否使数字孪生在能源和公用事业行业成为现实?
  • SpringBoot集成JWT token实现权限验证
  • 算法通关村第11关【青铜】| 位运算基础
  • 无涯教程-Android - RadioGroup函数
  • 降噪音频转录 Krisp: v1.40.7 Crack
  • 基于React实现:弹窗组件与Promise的有机结合
  • docker使用(一)生成,启动,更新(容器暂停,删除,再生成)
  • 用Qt自制一个小闹钟
  • Vue2.0/Vue3.0使用xlsx+xlsx-style实现导出Excel文件
  • 【Kafka系列】(一)Kafka入门
  • 外包干了2个月,技术退步明显了...
  • python实现语音识别
  • java八股文面试[多线程]——线程的状态
  • Go学习[合集]
  • 代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
  • 解决DNS服务器未响应错误的方法
  • SpringBoot的HandlerInterceptor拦截器使用方法
  • java 常用 jar 包
  • C#面试十问
  • Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树
  • 四轴飞行器的电池研究(MatlabSimulink仿真)
  • 准备HarmonyOS开发环境
  • Java 面试 - Redis
  • 【Go 基础篇】Go语言结构体之间的转换与映射
  • Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
  • 将 ordinals 与 比特币智能合约集成 : 第 1 部分
  • 【USRP】集成化仪器系列1 :信号源,基于labview实现
  • 串行协议——USB驱动[基础]
  • 健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评
  • PID 算法