文件上传(整体上传)

关于上传功能,其实有很多的插件去支持。我这里使用原生的input标签进行上传功能的开发。

i n d e x . j s x \color{green}{index.jsx} index.jsx


function handelChooseFile() {document.getElementById('chooseFiles').click()
}function handelFileChange(e: any) {fileToFormData(e)}// 转fromdata格式async function fileToFormData(e: any) {let files: any = e.targetif (!files.files.length) return// 上传文件 创建FormDatalet formData = new FormData()// 遍历FileList对象,拿到多个图片对象for (let i = 0; i < files.files.length; i++) {// formData中的append方法 如果已有相同的键,则会追加成为一个数组  注意:这里需要使用formData.getAll()获取formData.append('file', files.files[i], files.files[i].name)}let uploadData: any = formData.getAll('file')// 将input的值清空,解决第二次选择的文件与第一次相同时不会出发onchange事件。e.target.value = nulllet idFemales: any = await Storage.get({ key: 'lParentId' })uploadData.forEach((item: any, index: number) => {item.lParentId = idFemales.valueitem.create_time = moment(item.lastModifiedDate).format('YYYY-MM-DD HH:mm:ss')item.id = new Date().getTime() + index.toString()})Storage.set({ key: 'isUploadBack', value: 'true' })history.push({ pathname: '/uploadList', state: uploadData })}<input type="file" id="chooseFiles" multiple onChange={(e: any) => handelFileChange(e)} /><div onClick={handelChooseFile}>从本地文件选择</div>

i n d e x . s c s s \color{green}{index.scss} index.scss

#chooseFiles {width: 0;height: 0;opacity: 0;overflow: hidden;position: absolute;z-index: -1;
}

multiple属性是支持多选。我这里没有控制文件的格式,因为需要支持任意格式的数据。关于格式限制可以自行这里写div可以自定义上传按钮的样式。将input标签隐藏,通过点击div达到点击到input的效果。万能的div就可以自己任意布局了!

在input的onChange事件中,在 e.target中就可以拿到选中的所有文件的file数据了。
因为后端接口需要FormData格式的数据,所以这里进行的格式转换。转换完成后对于uploadData的遍历是增加我上传需要的一些信息,文件夹id、创建时间这些。

这里需要注意一下,因为上传选择的文件是没有唯一id标识的。所以如果要做上传失败后的重试功能会存在问题。因此我在这里通过时间戳+index的方式创建了唯一id。

history.push({ pathname: ‘/uploadList’, state: uploadData }) 因为我需要做上传列表。这里进行了跳转,实际上传的流程是在uploadList这个页面进行的。这里将上传的数据携带过去。

上传的请求要根据后端接口的实际情况来,我这里需要调用多个接口完成上传。较为复杂,所以在此假设后端用一个接口,这个接口就是接收上传数据,然后完成上传的功能举个例子。

u p l o a d L i s t . j x s \color{green}{uploadList.jxs} uploadList.jxs

componentWillUnmount(() => {// 拿到跳转时候携带过来的上传数据let newUploadList: any = history.location.state// 开始上传流程for (let i = 0; i < newUploadList.length; i++) {let parame = newUploadList[i]utils.post(uploadUrl, parame).then((res) => {console.log(res)}).catch((err) => {console.log(err)})}
})

utils.post是自己封装的post请求,uploadUrl为上传的接口url,将拿到的上传数据交给后端接口,完成上传。

分片上传

有时候我们上传的文件可能比较大,这个时候分片上传就显得尤为重要。其实分片上传很简单。当初第一次听到分片上传我是比较懵的。顾名思义,分片上传就是把一个文件分成多个片段,然后传给后端,后端将我们前端分割的所有片段再按顺序拼接起来就OK了。(这里就需要跟后端去讨论了,标识每一段的顺序什么的)

// 我按照15M每片的大小进行分割
let chunkNumber: any = Math.ceil(item.size / (1024 * 1024 * 15)) // 总片数(能分多少片)
let chunkSize: any = 1024 * 1024 * 15 // 每片大小
let chunks: any = [] // 总片段
for (let i = 0; i < chunkNumber; i++) {if (i < chunkNumber - 1) {// file为我们要上传的文件,也就是input上传时选中的文件。直接通过slice就可以实现对文件的切割。chunks.push(file.slice(chunkSize * i, chunkSize * (i + 1)))} else {chunks.push(file.slice(chunkSize * i, file.size))}
}

这样我们就把一个大文件按照15M分一片的方式切割好了,假设是一个32M的文件,通过分割,我们就切成了:chunks[15M, 15M, 2M]这样一个数组。然后通过循环将这个数组的每一片传给后端就OK了。是不是很简单。

文件上传、分片上传(react)相关推荐

  1. formdata上传文件_封装一个多文件断点续传、分片上传、秒传、重试机制的组件...

    本文为:多文件断点续传.分片上传.秒传.重试机制 的更新版,若想看初始版本的实现,请查看该文章. 凡是要知其然知其所以然 文件上传相信很多朋友都有遇到过,那或许你也遇到过当上传大文件时,上传时间较长, ...

  2. 【vue】 前端 基于 vue-simple-uploader 实现大文件断点续传和分片上传

    文章目录 一.前言 二.后端部分 新建Maven 项目 后端 pom.xml 配置文件 application.yml HttpStatus.java AjaxResult.java CommonCo ...

  3. java 大文件上传_JAVA大文件上传分片上传方法(附带demo)

    最近在做视频上传展示的相关业务!但是因为最开始使用的是单文件上传所以一旦遇到大文件上传的速度就非常慢!为此在网上一直找寻分片的方法!得到了思路! 直接讲一下我这边看了那么多文档加上自己理解写的demo ...

  4. 前端实现大文件上传分片上传断点续传

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  5. Java-断点续传(分片上传)

    什么是断点续传 用户上传大文件,网络差点的需要历时数小时,万一线路中断,不具备断点续传的服务器就只能从头重传,而断点续传就是,允许用户从上传断线的地方继续传送,这样大大减少了用户的烦恼. 解决上传大文 ...

  6. React大文件分片上传方案

    最近做了大文件(文件夹)分片上传的需求,记录一下. 原理: 前端进行大文件分片上传的方案几乎都是利用Blob.prototype.slice方法对文件进行分片,用数组将每一个分片存起来,最后将分片发给 ...

  7. 文件分片上传【前端】

    ·····················断更有点久了,工作太忙,个人太散漫了.还是要学会坚持写博客,毕竟也是自己学习进步的体现.闲话少说,直接进入今天的正题,文件的分片上传. 先介绍一下文件的分片上 ...

  8. 使用webuploader组件实现大文件分片上传,断点续传

    无组件断点续传.gif 1. 组件简介 webuploader:是一个以HTML5为主, Flash为辅的文件上传组件,采用大文件分片/并发上传的方式,极大地提高了文件上传的效率,同时兼容多种浏览器版 ...

  9. 在浏览器进行大文件分片上传(java服务端实现)

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 最近在做web网盘的系统,网盘最基本的功能便是文件上传,但是文件上传当遇到大文件的时候,在web端按传统方式上传简直是 ...

  10. iOS 利用AFNetworking实现大文件分片上传

    概述 一说到文件上传,想必大家都并不陌生,更何况是利用AFNetworking(PS:后期统称AF)来做,那更是小菜一碟.比如开发中常见的场景:头像上传,九宫格图片上传...等等,这些场景无一不使用到 ...

最新文章

  1. 百度重磅发布云手机:低配置也可玩大型游戏 21
  2. python 之三级菜单
  3. C语言以下4个选项中,不能看作一条语句的是?
  4. 淘宝Django书籍调研
  5. R统计工具:正态性检验
  6. linux 内核代码构架图
  7. Win7_刻录DVD
  8. 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
  9. * poj 1062 昂贵的礼物 dijkstra 枚举区间
  10. idea如何将web项目打成war包maven和非maven
  11. 含有自增序列的表中使用truncate与delete的不同结果
  12. Win7开机加速全攻略一:序章和开机原理
  13. matebook14支持触摸屏吗_MateBook14:同价位一个能打的都没有(我说的是屏幕)
  14. winxp专业版下安装sql2000企业版
  15. android日记app常用,这款知名极简日记 APP,终于有了 Android 版!
  16. 罗马音平假名中文可复制_日语五十音该怎么写呢?易混淆的五十音
  17. 市场调研报告-皮革离型纸市场现状及未来发展趋势
  18. 第三周实验题目2——robots协议
  19. 高级测试简历借鉴--深圳0803
  20. 曹操捷龙鸿宇CAD铝单板钣金展开插件

热门文章

  1. 后台添加商品功能的实现
  2. [NOTE]Android N SmartLock缺少很多功能
  3. AI助力航母大变脸:无人机航母浮出海面
  4. Python-Django毕业设计驾校预约系统小程序(程序+Lw)
  5. 我用css3为好友胡歌的宝宝做了一个动画照片墙
  6. 超搞笑的设计模式诠释(绝对经典)
  7. 全景教程丨VR全景拍摄如何拍摄日出和日落的场景?
  8. 在手机平台还原端游画质 《天刀》手游的美术升级之路
  9. 在线解密rar、zip压缩包,解决密码烦恼
  10. 通过网页调用英雄联盟国服api