OSS是一种分布式文件存储的一个不错选择,对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。
AccessKey用于程序方式调用云服务API,通常由AccessKeyId和AccessKeySecret这两个组成部分。AccessKeyId用于标识用户,AccessKeySecret用于验证用户的秘钥。
oss是收费的,每个bucket是一个存储空间,可以根据不同的项目创建不同的Bucket。
官方文档:OSS - Java SDK官网文档地址
1、引入pom依赖
com.aliyun.oss
aliyun-sdk-oss
3.8.0
2、配置文件 - application.properties
# EndPoint
aliyun.oss.file.endpoint=xxxx
# KeyId
aliyun.oss.file.keyid=xxxx
# KeySecret
aliyun.oss.file.keysecret=xxxx
# bucketName
aliyun.oss.file.bucketname=xxxx
# 访问图片的固定前缀
aliyun.oss.file.httpsprefix=xxxx
# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB
比如:
https://jiuyue.oss-cn-chengdu.aliyuncs.com
jiuyue就是bucketName
后面那个就是endpoint
3、创建一个工具类 - 主要用于读取配置文件里的bucketName和固定前缀
@Component
public class OssConstant implements InitializingBean {
/** 从配置文件中读取bucketName */
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
/** 从配置文件中读取存储文件的地址前缀 */
@Value("${aliyun.oss.file.httpsprefix}")
private String ossHttpsPrefix;
public static String BUCKET_NAME;
public static String OSS_HTTPS_PREFIX;
@Override
public void afterPropertiesSet() throws Exception {
BUCKET_NAME = bucketName;
OSS_HTTPS_PREFIX = ossHttpsPrefix;
}
}
4、创建一个配置类,主要是配置OSSClient,方便注入
@Configuration
public class OssConfig {
/** 从配置文件中读取endPoint */
@Value("${aliyun.oss.file.endpoint}")
private String ossEndpoint;
/** 从配置文件中读取KeyId */
@Value("${aliyun.oss.file.keyid}")
private String keyId;
/** 从配置文件中读取KeySecret */
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Bean
public OSSClient ossClient(){
return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);
}
}
5、创建一个Controller - 主要功能是上传、删除/批量删除图片、查询图片是否存在
更多api请见官方文档:OSS - Java SDK 官方文档
@RestController
@RequestMapping("/oss")
public class OssController {
@Autowired
private OSSClient ossClient;
/**
* 上传图片到OSS
* @param file 图片文件
* @return 图片访问地址
*/
@PostMapping("/upload")
public String ossUpload(MultipartFile file){
// 获取原始文件名(我一般都是用UUID生成新的文件名)
String fileName = file.getOriginalFilename();
// 文件夹名(可以用模块名)
String folder = "liuchengyin";
// 文件夹名(根据日期来存储)
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
// 文件名 - 使用UUID生成
String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");
if (fileName != null){
// 获取原始文件名的后缀,如.jpg .png
fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));
} else {
// 一般来说这种情况是不存在的
fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";
}
try {
ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
// 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)
// 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作
return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;
}
/**
* 删除OSS里的文件/文件夹(文件夹内不能有文件)
* @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
* @return
*/
@PostMapping("/delete")
public String ossDelete(String fileName){
ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
return "删除成功!";
}
/**
* 批量删除OSS里的文件
* @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
* @return
*/
@PostMapping("/deleteBatch")
public List ossDeleteBatch(@RequestBody List fileNames){
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
// 返回的就是删除成功的图片名集合(图片不存在,也会返回)
return deleteObjectsResult.getDeletedObjects();
}
/**
* 查询OSS里的文件是否存在
* @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
* @return 是否存在:true or false
*/
@GetMapping("/exist")
public Boolean isExist(String fileName) {
return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
}
}
使用postman测试上传文件的方式:
Github地址:SpringBoot - OSS对象存储Demo
Gitee地址:SpringBoot - OSS对象存储Demo
这是刚学SSM没多久时写的文章,相当于上面那个不是太完整(懒得删)。
1、引入pom依赖
com.aliyun.oss
aliyun-sdk-oss
3.8.0
2、代码测试
public class FileUpload {
// 上传文件流的方式 - 常用
public static void main(String[] args) throws FileNotFoundException {
// Endpoint以成都为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-chengdu.aliyuncs.com";
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维
String accessKeyId = "Xxxxxx";
String accessKeySecret = "Aaaaaaaa";
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流 - 文件地址
InputStream inputStream = new FileInputStream("f:\\成果.jpg");
// 存储BucketName、上传到OSS的文件名
ossClient.putObject("liuchengyin", "狗哥.jpg", inputStream);
// 关闭OSSClient
ossClient.shutdown();
}
}
1、在Spring配置文件中添加如下
2、上传后端代码示例
@Controller
public class uploadController{
// 注入OSSClient
@Autowired
private OSSClient ossClient;
/**
* 上传图片
* @param file 文件
* @param folder 文件所在文件夹名
*/
@PostMapping("/upload")
public String ossUpload(@RequestParam("file") MultipartFile file,String folder){
// BucketName
String bucketName = "liuchengyin";
// 获取原始的文件名
String fileName = file.getOriginalFilename();
// 使用UUID来处理文件名随机
fileName = folder + "/" + UUID.randomUUID() + file.getOriginalFilename();
try{
ossClient.putObject(bucketName,fileName,file.getInputStream());
}.cathc(Exception e){
e.printStackTrace();
}
// 返回图片地址
return "https://" + bucketName + ".oss-cn-chengdu.aliyuncs.com/" + fileName;
}
}
综上原链接: SpringBoot - 阿里云OSS对象存储简介及简单上传_江南烟雨却痴缠丶-CSDN博客
参考连接:基于springboot框架做oss文件上传功能具体实现_小白划水的博客-CSDN博客_springboot 上传oss
1.引入.pom
com.aliyun.oss
aliyun-sdk-oss
3.10.2
2.java 代码
package com.safe.smartsite.base.controller;
import java.io.ByteArrayInputStream;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.safe.common.core.rest.RestResponse;
import org.apache.commons.lang3.RandomUtils;
import org.joda.time.DateTime;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author LAn
* @date 2022年02月17日 17:19
*/
@RequestMapping("/oss_upload")
@RestController
public class OSSUploadController {
// 公共云下OSS Region和Endpoint 参照对照表(请求上传连接)
private static String endpoint = "https://oss-cn-beijing.aliyuncs.com";
private static String accessKeyId = "秘钥标识ID";
private static String accessKeySecret = "秘钥";
// 获取 OSS创建的桶 名称
private static String bucketName = "oss-sjgr-oa";
// 上传到 OSS 指定的路径
private static String objectName = "exampledir/exampleobject.txt";
// 允许上传的格式
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
".jpeg", ".gif", ".png"};
@RequestMapping(value = "/upload")
public RestResponse> upload(@RequestParam("file") MultipartFile file) {
// 校验图片格式
boolean isLegal = false;
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),
type)) {
isLegal = true;
break;
}
}
if (!isLegal) {
return null;
}
//文件新路径
String fileName = file.getOriginalFilename();
String filePath = getFilePath(fileName);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传到阿里云
try {
ossClient.putObject(bucketName, filePath, new ByteArrayInputStream(file.getBytes()));
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传失败<<<<<<<<<<<<<<<<");
//上传失败
return null;
}
System.out.println("上传成功!!!!");
//this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
return null;
}
/**
* 通过源文件获取 路径和文件名
* @param sourceFileName
* @return
*/
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "images/" + dateTime.toString("yyyy")
+ "/" + dateTime.toString("MM") + "/"
+ dateTime.toString("dd") + "/" + System.currentTimeMillis() +
RandomUtils.nextInt(100, 9999) + "." +
StringUtils.substringAfterLast(sourceFileName, ".");
}
}
3. 采坑 报如下错误可尝试引入以下配置:
java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy 错误解决办法 引入pom文件
org.apache.httpcomponents
httpclient
4.5.5
org.apache.httpcomponents
httpcore
4.4.5