聊聊文件上传

表单文件上传是一种很常见的需求,今天跟大家简单聊一聊文件上传的接口设计,以及改进思路。假设有下面这样一个表单:聊聊文件上传

看到这个表单,我的第一想法是这样的,前端在提交的时候,将整个表单内容(包括文件),一次性发给后端进行保存,所以接口设计如下

请求URL:/form/add
请求方式:POST
请求头:content-type: multipart/form-data
请求体:
 type: 类型
 description: 描述
 img: 图片

这样做看似没什么问题,但是在保存的时候才进行文件上传,接口的响应时间比较长,用户体验不好

基于上面的问题,我们可以把文件上传的动作单独抽取出来,在用户点击新增文件的时候,就将文件上传到服务器,点击提交的时候再将文件路径落库,整个前后端的交互如下图聊聊文件上传

  1. 用户选择文件,将文件上传到 OSS 的临时目录
  2. 上传成功,返回文件路径到客户端
  3. 用户点击提交表单(带上第 2 步返回的文件路径),服务端将临时文件保存到正式目录
  4. 表单提交成功

可以看到,我们将表单提交跟文件上传分离成两个动作:文件上传和表单提交。这样做有两个好处:

  1. 减少用户等待时间(文件后台提前上传)
  2. 文件上传接口复用,即当其他页面也有文件上传需求的时候,可以共用一个上传接口

这时候,你可能会想到另外一个问题,不同功能对文件上传都有一些个性化的要求,比如限制文件类型,文件大小,文件尺寸等。如果共用一个接口的话,就无法对上传的文件进行校验

其实这也很好解决,我们可以建一张规则表,保存文件的校验规则,表结构如下

CREATE TABLE `t_file_config` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `business_type` int(11DEFAULT NULL COMMENT '业务类型',
  `business_description` varchar(255DEFAULT NULL COMMENT '业务描述',
  `file_size` int(11DEFAULT NULL COMMENT '文件大小(单位k)',
  `file_type` varchar(255DEFAULT NULL COMMENT '支持的文件类型,逗号分隔',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `udpate_time` datetime DEFAULT NULL COMMENT '更新时间',
  `delete_flag` tinyint(1DEFAULT NULL COMMENT '删除标志,0 未删除,1 已删除',
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

这时候,我们就可以根据不同业务,插入对应的文件校验规则。然后在上传文件的时候,还需要传对应的业务类型(business_type),后端根据不同的业务类型对图片进行校验

到这里,表单文件上传的功能就讲完啦,大家在工作中对于表单上传的需求都是怎么设计的呢?可以通过公众号向我留言,一起交流探讨


原文始发于微信公众号(huangxy):聊聊文件上传

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/160049.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!