文件上传
文件上传是将本地的图片,视频,音频等文件上传到服务器,供其他用户浏览或下载的过程
文件上传在项目中应用十分广泛,我们经常发微博,发微信都用到了文件上传的功能
在前端的开发之中,如果需要文件上传功能,则必须在form表单中进行定义,且提交方式必须是post(因为文件的内容比较大),表单的数据格式也必须设置为multipart/form-data(因为文件的内容比较大)
<form action="" method="post" enctype="multipart/form-data">
头像:<input type="file" name="image">
</form>
在idea中后端接收文件:
在接受的方法中面对传递过来的数据文件,我们使用MultipartFile对象接收文件,通过断点测试,发现当传回来的文件中给出一段地址,打开地址是三个临时文件,分别对应三个参数,当通过运行之后发现文件消失,所以需要在后续保存文件
存储文件
本地存储
在服务器端,接受到上传上来的文件之后,将文件存储在本地服务器磁盘中
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception{
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名
String originalFilename = image.getOriginalFilename();
//将文件转存到服务器的磁盘目录当中
image.transferTo(new File("E:\\images\\"+originalFilename));
return Result.success();
}
对待文件的集成方法已经涵盖在了MultipartFile对象之中,transferTo可以指定将文件保存在指定目录下
但是这样会出现一个问题,采用原始数据名保存,当下一个名字相同的文件再次传输上来会覆盖之前的文件,这样就会出现问题,所以需要构造唯一的文件名
这个文件名就使用uuid(通用唯一识别码)
在对这个文件进行命名的时候采用 uuid+ 文件名后缀来进行命名
//构造唯一标识码
int i = originalFilename.indexOf(".");
String substring = originalFilename.substring(i);
String newFileName= UUID.randomUUID().toString()+substring.toString();
log.info("新的文件名:{}",newFileName);
//将文件转存到服务器的磁盘目录当中
image.transferTo(new File("E:\\images\\"+newFileName));
通过UUID类来创建唯一标识的字符串,并将拼接好的字符串加入到路径字符串
当上传文件服务器端出现如下错误:
这个错误说明当前请求的文件超过了文件大小限制,在spring中默认单个文件上传的最大大小为1M,如果需要上传大文件,可进行如下配置:
//配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB //默认为1M
//配置单个请求最大的上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB //默认为10M
- 文件存储本地的弊端
- 存储在服务器磁盘目录的数据文件,在最后是无法在前端页面上展现的
- 磁盘容量有限
常用方法:MultipartFile类中
云服务
为了处理本地存储的弊端,现在采用的存储方式
- 第一种:自主搭建
项目组自己搭建一套存储服务来自己存储上传的文件例如:
- FastDFS分布式文件系统
- Minlo对象存储服务集群
这个需要项目私人储备服务器
- 第二种:云服务
大型互联网公司提供的云服务服务器,比如阿里云OSS
阿里云
阿里云是阿里巴巴集团旗下的全球领先的云计算公司,也是国内最大的云服务提供商
阿里云不只由存储服务平台,还有提前设置好的各种功能服务
阿里云对象存储OSS(Object Storage Service)是一款海量,安全,低成本,高可靠的云存储服务,使用OSS,您可以通过网络随时存储和调用包括文本,图片,音频和视频等在内的各种文件
- 如何使用阿里云OSS
- 登录注册,简单配置
- 参照官方SDK编写入门程序
SDK:软件开发工具包,包括辅助软件开发依赖(jar包),代码示例等,都可叫做SDK
- 在项目中集成使用
准备工作:
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有对象都必须隶属于某个存储空间。
阿里云地址:https://www.aliyun.com
创建Bucket:
填写名称,一般地域选择默认,剩下的一般默认,读写权限设置为公共读
获取AccessKey密钥:
右上角的头像,选择AccessKey管理
- SDK
在左侧的栏中找到SDK下载,点击SDK示例
点击后出现官方文档,点击在文档中心打开,查看SDK文档找到对应的操作
这里找到Maven项目下的官方依赖
在SDK文档中找到关于Java文件上传的文档,进行简单修改
- 阿里云OSS集成
当前端传输上传一张图片的时候:
- 在Controller类中接收上传的图片
- 将图片储存起来(OSS)
- 返回图片访问的URL
- 开发文件上传接口
- 引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
- 上传图片接口开发
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private Integer code; //响应码,1代表成功,0表示失败
private String msg; //响应信息,描述字符串
private Object data;//返回的数据
public static Result success(){ //增删改,成功响应
return new Result(1,"success",null);
}
public static Result success(Object data){//查询 成功响应
return new Result(1,"success",data);
}
public static Result success(String msg){//失败响应
return new Result(0,msg,null);
}
}