JAVA后端实现文件上传,比如图片上床功能,有很多实现方案,可以将图片保存到服务器的硬盘上。也可以建立分布式集群,专门的微服务来存储文件常见的技术比如Minio。对于中小型公司,并且上传文件私密性不高的话可以使用第三方的存储服务,比如阿里云、华为云等。
阿里云官网地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务,提供 99.995 % 的服务可用性和多种存储类型,适用于数据湖存储,数据迁移,企业数据管理,数据处理等多种场景,可对接多种计算分析平台,直接进行数据处理与分析,打破数据孤岛,优化存储成本,提升业务价值。https://www.aliyun.com/product/oss
一般入手第三方服务的学习,不要通读文档,可从官方的快速入门入手。将快速入门的代码粘一粘,看看哪些参数不应该写死应该抽取成工具类,哪些代码是核心的哪些代码可以省略,debug跑一下看看各个变量的值都是什么干什么用的
利用阿里云OSS来存储文件,首先要在管理控制台上Bucket列表中建立自己的存储空间Bucket,填写好自己的Bucjet名称、地域等信息。并且创建好AccessKey秘钥的id和密码,后续需要将Bucjet名称、地域、AccessKey秘钥的id和密码的信息写到配置yml文件中,在将其注入到SpringIOC容器中。
使用阿里云,Java代码编写前,pom.xml中导入aliyun-sdk-oss和aliyun-java-sdk-core依赖。
代码的核心就是通过区域、密匙等信息创建ossClinet客户端,上传文件根据储存地址转成输入流inputstream,调用ossClient.putObject方法,传入参数Bucket桶的名称、图片上传后的名称、图片输入流,就可完成图片上传功能
这种像图片上传的共用的功能,我们会抽取为工具类,供大家使用。
Bucjet名称、地域、AccessKey秘钥的id和密码等信息为方便后续修改,应将其写到配置文件中,通过创建配置类将其读取,在工具类中将其注入并通过@Import注解将其放到IOC容器中。
oss:
key: 密匙id
secret: 密匙密码,都为自己创建的,在官网创建时记得保存
endpoint: oss-cn-beijing.aliyuncs.com 区域地址,上述为北京区域
bucket: 桶名字
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "oss")//读取配置信息
public class OssProperties {
private String key; //密匙id
private String secret;//秘钥密码
private String endpoint;//区域地址
private String bucket;//桶名
}
一般都可以用@ConfigurationProperties这个注解来读取配置文件中的信息,使用@Value配合EL表达式也可做到读取配置文件中的信息,但是上述更为常见简单。
紧接着抽取工具类即可,工具类中注入OssProperties对象,上标注@Component与
@Import(OssProperties.class)注解
//阿里存储工具类
@Component
@Import(OssProperties.class)//导入,相当于将OssProperties对象放入容器
public class OssTemplate {
@Autowired
private OssProperties ossProperties;
//文件上传
public String upload(String fileName, InputStream inputStream) {
//根据上面叙述的参数创建客户端
OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getKey(), ossProperties.getSecret());
//设置最终存储文件的路径和名称,自定义的,根据项目要求定义
String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
+ "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
//meta设置请求头,解决访问图片地址直接下载
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
//上传
ossClient.putObject(ossProperties.getBucket(), objectName, inputStream, meta);
//关闭客户端
ossClient.shutdown();
//可通过下述地址访问到图片,可将地址存储到数据库中
return "https://" + ossProperties.getBucket() + "." + ossProperties.getEndpoint() + "/" + objectName;
}
//文件后缀处理,比如文件叫1.jpg,下述方法抽取取得就是.jpg
private String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpg";
}
return "image/jpg";
}
}
官网快速入门中的截图:
图片上传大小默认是1M,太小了,需要修改,需修改配置文件
spring:
servlet:
multipart:
max-request-size: 100MB # 最大请求文件大小,默认10MB
max-file-size: 10MB # 单个请求文件大小,默认1MB
最后在应用代码中,写在controller层就可不必非写到service层,调用抽取的工具类ossTemplate.upload方法就可,注意参数接收文件类型为MultipartFile。