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

前端临床手札——文件上传

文件上传基本是学习前端路上必定遇到的例子,然而网上能找到的都是单单满足上传这步的案例。大多文章之所以只说上传这步估计是简单易入门,但是实际工作时就会发现上传文件这个功能上是简单的,逻辑上却比较复杂。

先说一下需求和功能点:

需求:上传文件到服务器
功能:上传

单这么看是简单的,下面再补充一下:

需求2:
    需要对图片裁剪压缩
    文件必须控制在2MB内
    上传文件必须是图片,包含的文件格式有:jpg、gif、png、jpeg、bmp
    上传文件到服务器
    记录上传文件(包含文件名字、位置、后缀、大小等)
功能:
    判断文件格式
    裁剪压缩图片
    上传
    记录数据

也不算复杂,可是这个从业务上来看只是单单的上传功能而已,用户可能还会提出更多要求,如:需要可视化信息(显示上传进度、提示上传成功或失败)、选择上传位置(或云存储,如:七牛)、需选择上传后的文件等其他需求,这就不细说了

还是说说我遭遇的较为复杂的需求:

需求3:
    上传文件
    文件是图片则上传到[图片]仓库,是视频则上传到[视频]仓库,其他则上传到[其他]仓库
    需要对图片裁剪压缩
    文件大于2MB需启用分片上传
    上传至七牛云储存
    显示上传进度、提示上传结果
    记录上传文件(包含文件名字、位置、后缀、大小等)
功能:
    判断文件格式
    请求相应仓库上传token
    --图片--
    获得文件md5(作为文件名)
    裁剪压缩图片
    --视频--
    判断文件大小,大于2mb开启分片上传
    上传
    记录数据

这里面包含各种组件间数据传输、异步数据获取等问题尤为恶心...所以我还是拿需求2这份继续下面话题。

就目前需求能看出功能点是串行的,如下:

function upload(file){
    var verify = function(file){ return new Promise(...) },
        cut = function(file){ return new Promise(...) },
        upload = function(file){ return new Promise(...) },
        error = function(){...};
    return verify(file).then(cut).then(upload).catch(error);
}

//file change event
upload(e.currentTarget.files[0]).then(/*记录数据*/).catch(...);

若上传组件考虑可扩展性得把逻辑处理分离出来,逻辑处理也能以组件方式引入其中并予以调用。但前提是需要约定传入值和返回类型。

//上传类
function UploadFile(file){
    this.file = file;
    this.name = file.name;
    this.size = file.size;
    this.toFormData = function(data){...};
}

var uploader = new Uploader(),
    verify = function(uploadFile){ return new Promise(...) },
    cut = function(uploadFile){ return new Promise(...) };
uploader.precondition.add([verify,cut]);

//file change event
var key = function(uploadFile){ return new Promise(...) },
uploader.precondition.add(key); //可添加新条件
uploader.upload(new UploadFile(e.currentTarget.files[0])).then(/*记录数据*/).catch(...);

说这么多概念上的东西为的就是记录下工作时的真实情况,需要考虑的不单是功能,还得理解用这个功能的人背后的故事。

相关文章:

  • IDEA Git版本回滚提交方式
  • spring framework 模块简介
  • Vue2.5 零基础开发去哪儿网实战(二) - 起步 Vue.js
  • 数组(list)分组、分段
  • 编译并导入OpenSSL
  • Rsync软件错误总结
  • 《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议
  • 小程序button引导用户授权
  • 初识云计算的三种服务模式 (IaaS SaaS PaaS)
  • 大数据hadoop领域技术总体介绍(各个组件的作用)
  • 使用git时候,屏蔽gitignore自身
  • 【VMCloud云平台】拥抱Docker(四)定制属于自已的镜像
  • vue ----自定义指令Vue.directive(),实现拖拽
  • Scalaz(14)- Monad:函数组合-Kleisli to Reader
  • 微软以白金会员加入 OpenChain 开源组织
  • 【node学习】协程
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 2018一半小结一波
  • CAP理论的例子讲解
  • co模块的前端实现
  • JavaScript 奇技淫巧
  • leetcode386. Lexicographical Numbers
  • MaxCompute访问TableStore(OTS) 数据
  • MobX
  • MYSQL 的 IF 函数
  • Netty 4.1 源代码学习:线程模型
  • Python 反序列化安全问题(二)
  • Redux 中间件分析
  • SSH 免密登录
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue全家桶实现一个Web App
  • Vue实战(四)登录/注册页的实现
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从0实现一个tiny react(三)生命周期
  • 多线程事务回滚
  • 反思总结然后整装待发
  • 漂亮刷新控件-iOS
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 时间复杂度与空间复杂度分析
  • 树莓派 - 使用须知
  • 智能合约开发环境搭建及Hello World合约
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 从如何停掉 Promise 链说起
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​香农与信息论三大定律
  • #QT(一种朴素的计算器实现方法)
  • (33)STM32——485实验笔记
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (力扣题库)跳跃游戏II(c++)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。