表单文件上传是一种很常见的需求,今天跟大家简单聊一聊文件上传的接口设计,以及改进思路。假设有下面这样一个表单:
看到这个表单,我的第一想法是这样的,前端在提交的时候,将整个表单内容(包括文件),一次性发给后端进行保存,所以接口设计如下
请求URL:/form/add
请求方式:POST
请求头:content-type: multipart/form-data
请求体:
type: 类型
description: 描述
img: 图片
这样做看似没什么问题,但是在保存的时候才进行文件上传,接口的响应时间比较长,用户体验不好
基于上面的问题,我们可以把文件上传的动作单独抽取出来,在用户点击新增文件的时候,就将文件上传到服务器,点击提交的时候再将文件路径落库,整个前后端的交互如下图
-
用户选择文件,将文件上传到 OSS 的临时目录 -
上传成功,返回文件路径到客户端 -
用户点击提交表单(带上第 2 步返回的文件路径),服务端将临时文件保存到正式目录 -
表单提交成功
可以看到,我们将表单提交跟文件上传分离成两个动作:文件上传和表单提交。这样做有两个好处:
-
减少用户等待时间(文件后台提前上传) -
文件上传接口复用,即当其他页面也有文件上传需求的时候,可以共用一个上传接口
这时候,你可能会想到另外一个问题,不同功能对文件上传都有一些个性化的要求,比如限制文件类型,文件大小,文件尺寸等。如果共用一个接口的话,就无法对上传的文件进行校验
其实这也很好解决,我们可以建一张规则表,保存文件的校验规则,表结构如下
CREATE TABLE `t_file_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`business_type` int(11) DEFAULT NULL COMMENT '业务类型',
`business_description` varchar(255) DEFAULT NULL COMMENT '业务描述',
`file_size` int(11) DEFAULT NULL COMMENT '文件大小(单位k)',
`file_type` varchar(255) DEFAULT NULL COMMENT '支持的文件类型,逗号分隔',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`udpate_time` datetime DEFAULT NULL COMMENT '更新时间',
`delete_flag` tinyint(1) DEFAULT 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