需要了解,new FormData() --上传时,将内容转为文件流

FormData提供一种表示表单数据的键值对的构造方式,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率

new FileReader()--base64压缩,目前不了解

一、excel文件导出

三种导出: 一种是纯粹前端导出;两种后端导出: 分为 后端给地址导出,还有就是文件流的形式导出,最好是后端导出,不会卡 ,前端导出数据量一大 很卡

Blod:blob是存放二进制大对象的容器,包括large object ;创建一个bold对象

后端返回二进制数据流,生成Excel :

① 点击模板获取--导出,弹框进行确认,点击确认

② 调接口,获取结果,接口的reaponseType: ' blob'

③ 调用window的url方法,创建a标签,点击a = url, 设置点击下载

-- 导出文件为 pdf 时,修改 type: 'application/pdf;chartset=UTF-8'

  // 模板获取const getTemplate = async () => {const res = await getStuTemplate()// const blob = new Blob(['\ufeff' + res], { type: 'application/vnd.ms-excel' })// 调用window的url方法const url = window.URL.createObjectURL(res)// 通过创建a标签实现const link = document.createElement('a')link.href = url// 命名// link.download = res?.headers['content-disposition'].split(';')[1].split('=')[1] || '模板'link.download = decodeURI('考生信息')document.body.appendChild(link)// 下载文件link.click()// 释放内存 document.body.removeChild(link)}
// 考生信息--导出excel模板
export async function getStuTemplate(params?: any) {return request(`/${Proxy_Api}/entrantManage/exportExcel`, {method: 'GET',responseType: 'blob',params,})
}
// 导出 -- PDFconst getTemplate = async () => {const res = await getStuTemplate({ code })// 创建blob对象,解析流数据const blob = new Blob([res], { type: 'application/pdf;chartset=UTF-8'})// 调用window的url方法,根据解析后的blob对象创建URL 对象const url = window.URL.createObjectURL(blob)// 通过创建a标签实现const link = document.createElement('a')link.href = url// 命名// link.download = res?.headers['content-disposition'].split(';')[1].split('=')[1] || '模板'link.download = decodeURI('请假统计')document.body.appendChild(link)// 下载文件link.click()// 释放内存 document.body.removeChild(link)}

二、excel文件 导入--上传

   ① 用Dragger组件进行上传,点击上传后,选取文件

② 设置组件的props,用beforeUpload钩子函数拦截文件,不设置action地址,取消自动上传

③ 通过beforeUpload,拦截默认上传,对上传文件进行处理,可以判断文件格式

④ 点击modal弹框的确认后,创建new FormData(),使用append,发送fetch请求,返回数据需要转化为json格式

① 设置组件<Modal destroyOnClose={true} title="数据导入" visible={isUploadOpen} onOk={handleOkUpload} onCancel={handleCancelUpload} width={550}><Dragger {...props} style={{ marginBottom: 20, marginTop: 20 }}><p className="ant-upload-drag-icon"><InboxOutlined /></p><p className="ant-upload-text">点击或将文件拖拽到这里上传</p><p className="ant-upload-hint">当前仅支持扩展名:.xls/.xlsx</p></Dragger><p style={{ fontSize: 12, color: '#00000073', marginTop: 10 }}>注:若在此之前已经上传过数据而此次上传存在覆盖操作,则相关分组信息需要重新导入</p></Modal>// dragger组件
② 设置组件props// 设置文件变量const [oneFile, setOneFile] = useState<any>();const props: UploadProps = {maxCount: 1, //最大数量multiple: false,  //是否支持多选onRemove: (file) => {  //删除setOneFile(null)},// beforeUpload 拦截默认上传,回调参数就是file文件// 可以对文件类型进行判断beforeUpload: (file) => {const fileName = file.name.substring(file.name.lastIndexOf('.') + 1, file.name.length)const fileType = fileName == 'xls' || fileName == 'xlsx'if (!fileType) {message.error('上传失败,请上传xls/xlsx格式的文件')} else {setOneFile(file)}return false;},};
③ 上传文件/**点击上传 */const handleOkUpload = () => {const formData = new FormData();formData.append('file', oneFile as RcFile);fetch(`${Proxy_Api}/entrantManage/importExcel/${code}`, {method: 'POST',body: formData,}).then((res) => {return res.json()}).then((res) => {if (res?.success) {message.success('导入成功');setOneFile(null)setIsUploadOpen(false)} else {message.error(res.desc)}}).catch(() => {message.error('导入失败');})};

三、照片上传

① 上传props,不设置action,设置beforeUpload,拦截上传文件

② 对上传文件进行判断,格式,大小,每次上传前,修改变量  oneFile ,用于最后提交

③ 设置props的 onChange,改变上传文件时,调用base64方法,修改imageUrl变量,用于在页面显示当前上传图片

④ 提交,new FormData 来转为文件流,使用append,发送fetch请求,返回数据需要转化为json格式

① 设置组件const [imageUrl, setImageUrl] = useState<any>();<Form.Item label="考点图片" name="photo"><Upload  {...props} >{imageUrl ? // 上传图片后,图片反显,图片+上传按钮[<img src={imageUrl} alt="avatar" style={{ height: '60px', marginRight: 10 }} />, <Button icon={<UploadOutlined />}>上传文件</Button>] : <Button icon={<UploadOutlined />}>上传文件</Button>}</Upload></Form.Item>
② 设置上传props// 上传的props
const props: UploadProps = {maxCount: 1,multiple: false,name: "avatar",action: "#",listType: "picture",className: "avatar-uploader",showUploadList: false,onRemove: (file) => {setOneFile(null)},/**上传文件之前的钩子,参数为上传的文件,可设置文件格式和大小,若返回false停止上传 */beforeUpload: beforeUpload,onChange: handleChange,};
③ 提交上传文件const [oneFile, setOneFile] = useState<any>(); //文件变量
/**上传文件之前的钩子,参数为上传的文件,可设置文件格式和大小,若返回false停止上传 */const beforeUpload = (file: RcFile) => {const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';if (!isJpgOrPng) {message.error('请上传 JPG/PNG 格式的图片!');}const isLt2M = file.size / 1024 / 1024 < 2;if (!isLt2M) {message.error('图片需要小于 2MB!');}setOneFile(file)return isJpgOrPng && isLt2M;// 返回false ,不请求,但是获取不到显示图片,用action:"#",替换不请求// return false;};
  ④ base64设置反显图片// 上传判断,是否显示图片const getBase64 = (img: RcFile, callback: (url: string) => void) => {const reader = new FileReader();reader.addEventListener('load', () => callback(reader.result as string));// 方法可以将读取到的文件编码成DataURL ,可以将资料(例如图片、excel文件)内嵌在网页之中,不用放到外部文件reader.readAsDataURL(img);};
  ⑤ onChange--上传文件改变时的回调 */const handleChange: UploadProps['onChange'] = (info: UploadChangeParam<UploadFile>) => {if (info.file.status === 'uploading') {return;}if (info.file.status === 'done') {getBase64(info.file.originFileObj as RcFile, (url) => {setImageUrl(url);});}};
⑥ 提交/**新增、修改--确认 */const handleOk = () => {addForm.validateFields().then(async (values) => {if (imageUrl) {const { address, examYear, code, name } = valueslet newForm = new FormData()newForm.append("address", address);newForm.append("examYear", examYear);newForm.append('code', code);newForm.append('name', name);newForm.append('photo', oneFile);fetch(`${Proxy_Api}/examPlaceManage`, {method: 'POST',body: newForm,}).then((res) => {return res.json()}).then((res) => {if (res?.success) {message.success('新增成功');setOneFile(null)setIsModalOpen(false);} else {const { desc } = resmessage.error(desc);}}).catch(() => {message.error('新增失败');})

四、mp4视频下载

参考:前端使用 fetch() 流式下载.mp4视频文件,跟踪进度_fetch下载进度_快撑死的鱼的博客-CSDN博客

使用 fetch API 进行流式下载时,可以使用 Response.body 对象跟踪下载进度

流读取:

Response.body 是一个 ReadableStream 对象

ReadableStream.getReader() 创建流读取器,并且会把流锁定,默认返回的是 ReadableStreamDefaultReader 类型

The getReader() method of the ReadableStream interface creates a reader and locks the stream to it. While the stream is locked, no other reader can be acquired until this one is released.

response.headers.get('Content-Length') 得到响应的总长度

ReadableStreamDefaultReader.read() 方法得到一个 Promise 对象,可以获取到流内部序列中的下一个分块,循环调用直到完成,同时收集数据得到一个 Uint8Array 数组

最后转换成 Blob 就可以完成下载了

//点击视频,调接口,获取视频。下载本地const getVideo = async () => {const videoUrl = `/${Second_Proxy_Api}/realTimeMonitor/selectVideo/....`const response = await fetch(videoUrl)const reader = response.body.getReader()const contentLength = +response.headers.get('Content-Length')let receivedLength = 0let chunks = []while (true) {const { done, value } = await reader.read();if (done) {break}chunks.push(value)receivedLength += value.length// 下载进度console.log(`Reveived ${receivedLength} of ${contentLength}`)}// 通过创建a标签实现const a = document.createElement("a");a.style.display = 'none'document.body.append(a)// 调用window的url方法const url = window.URL.createObjectURL(new Blob(chunks, { type: 'video/mp4' }))a.href = url// a.download = item.name --命名a.download = '视频'// 下载文件a.click()// 释放内存document.body.removeChild(a)window.URL.revokeObjectURL(url)}

react-前端excel 文件/PDF文件 导入 --导出、照片上传、mp4格式视频下载相关推荐

  1. x-data-spreadsheet 在线编辑excel文件,支持导入/导出/上传/读取网络 excel,合并单元格(vue版本)

    1. 环境 vue:2.6.10 x-data-spreadsheet:1.1.8 less:4.0.0 less-loader:7.1.0 xlsx:0.15.1 axios:0.18.1 2. 优 ...

  2. React 实现Excel 文件下载(实现导入导出)

    封装的工具类,有页面需要使用此功能时可直接调用: import apiPath from 'Common/apiPath' import { message } from 'antd'const Ut ...

  3. Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片

    将Office文件转换为PDF文件,提取Office文件中的所有图片 1.Office系列---将Office文件(Word.PPT.Excel)转换为PDF文件 1.1 基于Office实现的解决方 ...

  4. 前端实现生成pdf文件并下载

    前端实现生成pdf文件并下载 思路 下载依赖 使用方式 备注 参考 思路 通过 html2canvas 将 HTML 页面转换成图片,然后再通过 jspdf 将图片的 base64 生成为 pdf 文 ...

  5. 前端vue实现pdf文件的在线预览

    3.前端vue实现pdf文件的在线预览 我是通过 <iframe> 标签就可以满足我工作的 pdf预览需求 如果<iframe> 无法满足需求 , 可以使用pdf.js这个插件 ...

  6. android选择多个文件_一分钟合并多个Excel、PDF文件,3种方法任你选择,好用到没朋友...

    一分钟合并多个Excel.PDF文件,3种方法任你选择,好用到没朋友 前情提要: Excel.PDF多个文件怎样合并成一个文件?需求场景: PDF文件合并 当一份完成的PDF资料分为很多份的时候,我们 ...

  7. java操作Excel、PDF文件

    java操作Excel.PDF文件 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的java操作excel的工具, 在开源世界中, ...

  8. Linux下命令行打开word、excel、pdf文件

    Linux下命令行打开word.excel.pdf文件 1.打开word文件 wps xxx.docx xdg-open xxx.docx 2.打开excel文件 et xxx.xlsx xdg-op ...

  9. Java 将 Excel 转换为 PDF 文件

    持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情 今天这是篇粗糙的文章,文字也较少,整理了个Java将Excel 转换为 PDF 文件的工具类.(还比较 ...

最新文章

  1. 量子计算机个人化时间,科学家发现量子算法可以停止时间
  2. Nature论文解读:用于改善加权生物网络信噪比的网络增强方法
  3. asp.net截取指定长度的字符串内容
  4. Introspector内省和反射的区别.
  5. resttemplate post提交json_SEO工具脚本,Python百度普通收录API提交工具
  6. php实现excel单元格合并,字体加粗居中等操作
  7. 一像素约束(选中所需约束,切换到类处,选择此类,运行时就是0.5的约束)
  8. 2016OSC源创会年终盛典-架构与数据专场-杨亮
  9. android 补签控件,墨墨背单词怎么补签 看完你就懂了
  10. 买房,有多少人帮助过你?
  11. CNN更新换代!性能提升算力减半,还即插即用
  12. [转载] python笔记:4.1.2.1统计量_离散程度_方差和标准差
  13. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建
  14. Linux系统CentOS 7中安装配置JDK
  15. 详解显式intent和隐式intent
  16. java基本变量_Java 基础之变量和基本数据类型
  17. 从总监到CEO的一些思考和理解
  18. 用Beamer做slides-模板
  19. Python PyQt5
  20. SwiftUI脑洞大开打造实时显示当前值的Slider(滑动器)

热门文章

  1. Java实现简单的贪吃蛇
  2. ArcGIS 坐标系统文件 ---beijing 1954 高斯克吕格投影在arcgis中的说明
  3. 7-144 最矮的巨人
  4. 基于JAVA医院信息管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  5. 在vi 中设置tab键为4个空格,并显示行号,对文件中的TAB与空格进行相互转换
  6. scratch项目/mblock项目:打地鼠(事件类之消息广播、控制类之克隆体、数据类之新建模块指令综合应用)
  7. python aes解密脚本
  8. 《应用回归分析》何晓群 最新版数据下载
  9. 使用HBuilderX下载插件及运行微信小程序
  10. 网站转APP软件封装网页转APP打包H5封装分发平台APP封装生成双端