向web系统上传文件是一个常见的需求,比如上传头像、上传照片等等。
针对文件上传,前端页面有三个要素:
- 表单提交方式为
post
,因为文件可能很大。 - 表单的
enctype
属性为multipart/form-data
。 - 上传文件的表单项
type="file"
。
按照spring boot项目controller方法接收请求参数的方法,需要将方法的形参设置为MultipartFile
类型。该类是spring框架提供的类。该类提供了一些方法,比如获取原始文件名、文件存储在服务器文件系统中等等。具体的接口名和使用方法可以找网上的资料。在spring boot中文件上传的单个文件默认最大大小为1M字节,超过就会报错,如果需要上传大文件,需要对spring项目进行配置。(实际产品中也基本会对上传文件大小做限制。)
注意如果上传的文件名相同,路径也相同,可能导致文件被覆盖从而旧文件丢失。建议使用uuid通用唯一识别码,Java提供了uuid的相关工具类,可以直接使用。
显然在现在的web服务中,如果有一定规模的文件存储需求,一般会使用云存储服务,例如OSS对象存储服务。要使用第三方的云服务,就意味着需要使用第三方机构提供的代码并集成到自己的项目中。
一般来说,使用第三方服务的通用思路为:
- 准备工作,如登录、配置、认证等等。
- 参照提供的SDK编写简单demo程序。
- 开始集成到自己的代码中。
这部分没有什么需要特别记录的要点,只需要按照云服务提供商提供的SDK和文档操作即可。(也就是说你的开发难易程度基本上依赖于厂商提供的文档的完善程度。)有一点需要注意的是使用SDK通常需要进行一些参数配置,官方提供的demo一般直接硬编码到代码中,所以需要我们自行在配置文件中进行配置。
回到后端系统文件上传功能的开发,使用云OSS服务的一个好处在于会为每个存储对象分配一个公网访问的url,也就是说你可以给前端传回该url从而使用文件(主要是图片)的显示。例如,在创建一个新用户时,通常会上传用户头像,在用户上传本地图片之后,可以立刻看到其上传的图片。