1 简介
文件上传:将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程
文件上传涉及到两部分:前端程序 + 服务端程序
前端程序
【三要素】:① 需要定义一个form 表单,且表单里需定义一个类型为“ file ” 的表单项;② 表单的提交方式必须为post 方式;③ 需要通过 enctype 属性来指定表单的编码格式为“ multipart/form-data”,因为普通默认的编码格式不适合传输大型的二进制数据
服务端接收文件
通过Spring提供的 API:MultipartFile 接收上传的文件,上传上来的文件是一个临时的文件,当我们文件上传这次请求响应完毕之后,该临时文件会自动删除
【注】get 是获取信息(获取),post 是负责传输信息(提交);get 在 url 后拼接,post 在数据体中发送
MultipartFile 常用方法:
2 本地存储
本地存储:在服务端接收到上传上来的文件之后,将文件存储到本地服务器磁盘中
【执行过程】通过 MultipartFile 所有的 image 信息都已经获取到,利用 image.getOriginalFilename(),就可以获取到文件的原始名,然后保存为本地磁盘中的文件名
存在问题: A用户和B用户上传同名文件,则会导致数据被覆盖
代码优化
【注】实际项目开发过程中,本地存储的方式较为少用,原因:① 前端页面没法直接访问这些存储在本地磁盘的文件;② 磁盘容量有限;③ 磁盘损坏,则数据全部丢失
3 阿里云OSS
3.1 准备
阿里云对象存储(Object Storage Service):可通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件
使用第三方服务器的通用思路:
Bucket:存储空间,是用户用于存储对象(Object,就是文件)的容器,所有的对象必须隶属于某个存储空间
AccessKey:包含AccessKey ID以及AccessKey Secret
SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar 包)、代码示例等,都可以叫做SDK
3.2 入门
官方文档链接(也可以登录自己账号以后在后台查看SDK) :
对象存储 OSS-阿里云帮助中心 (aliyun.com)
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
String content = "Hello OSS";
//创建PutObject请求
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
3.3 集成
在新增员工的时候,需要上传员工图片,这里一共需要做两件事:① 上传图像并进行保存;② 访问这个图像
【执行过程】在新增员工的表单录入完毕,点击保存按钮以后,表单中的所有数据(包括图像的 url )都会提交到服务端,以此来请求新增员工的接口,最终将这个员工的信息保存到员工表中。此时 emp 对象所封装的数据,既包括员工的基本信息又包括员工的图像。
集成步骤:
1、引入阿里云OSS上传文件工具类(官方文档改造)
如何通过ossutil创建Bucket并上传文件_对象存储 OSS-阿里云帮助中心 (aliyun.com)
命令行工具ossutil_对象存储 OSS-阿里云帮助中心 (aliyun.com)
【注】需要在该工具类上加入 @Component 注解,把这个工具类交给 IOC 容器管理
2、上传图片接口开发