一、配置OSS相关配置信息
1、要配置 OSS 相关配置信息,您可以按照以下步骤操作:
- 登录阿里云控制台,进入 OSS 控制台,创建一个新的 OSS Bucket,并记录下以下信息:Bucket 名称、Bucket 所属地域、AccessKey ID、Access Key Secret。
- 在您的 Java 项目中添加阿里云 Java SDK 依赖。您可以在项目的 pom.xml 配置文件中添加以下依赖项:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.13.1</version>
</dependency>
- 在您的 Java 代码中配置 OSS 客户端。您可以使用以下示例代码来配置 OSS 客户端:
oss:
endpoint: https://oss-cn-yourAddress.aliyuncs.com
accessKeyId: yourAccessKeyId
accessKeySecret: yourAccessKeySecret
bucketName: yourBucketName
fileUrlPrefix: https://yourBucketName.oss-cn-hangzhou.aliyuncs.com/
2、添加OSSConfig类
这段代码定义了一个名为OSSConfig的类,它使用了注解@Value来获取配置文件中的值,并定义了一个名为ossClient的Bean,用于创建一个OSSClient对象。
具体来说,代码中的@Value注解用于从配置文件中获取oss.endpoint、oss.accessKeyId和oss.accessKeySecret的值,并将它们分别赋给endpoint、accessKeyId和accessKeySecret这三个私有变量。这样,这些变量就可以在类中被访问和使用了。
另外,代码中的@Bean注解用于告诉Spring容器,当需要一个名为ossClient的Bean时,它应该调用ossClient()方法创建一个OSSClient对象并返回给调用者。具体创建OSSClient对象的方法是使用OSSClientBuilder构建器的build()方法,传入endpoint、accessKeyId和accessKeySecret三个参数,从而创建一个连接到阿里云OSS服务的客户端对象。
@Configuration
public class OSSConfig {
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Bean
public OSS ossClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
二、OSS实现文件的上传、下载、删除及修改功能
首先创建一个 OSSController
,并注入对象
@Autowired
private OSS ossClient;
@Value("${oss.bucketName}")
private String bucketName;
@Value("${oss.fileUrlPrefix}")
private String fileUrlPrefix;
1、上传文件
-
方法名为upload,返回类型为Map<String, Object>,参数为MultipartFile类型的file对象,该对象代表上传的文件。
-
通过调用file对象的getOriginalFilename()方法获取上传文件的原始文件名,并将其赋值给fileName变量。
-
使用UUID生成一个唯一的对象名称objectName,以保证上传的文件不会覆盖已有的文件。objectName的值由UUID和文件后缀名组成,例如:f6d8b25a-d6b0-4b7b-8d6a-0e1f7c1a3a9a.jpg。
-
通过file.getInputStream()方法获取上传文件的InputStream对象,使用该对象来上传文件到OSS中。
-
调用阿里云Java SDK提供的putObject方法上传文件,并将上传结果赋值给result变量。
-
将上传文件的URL地址和文件名放入HashMap对象data中,其中fileUrlPrefix是OSS中存储文件的URL前缀,例如:https://my-bucket.oss-cn-hangzhou.aliyuncs.com/。
-
打印上传成功的信息,返回data对象。
-
如果上传过程出现异常,将异常信息打印出来,并抛出该异常。
@ApiOperation("上传文件")
@Log(value = "上传文件")
@PostMapping("/upload")
public Map<String, Object> upload(@RequestPart("file") MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
assert fileName != null;
String objectName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
try (InputStream inputStream = file.getInputStream()) {
PutObjectResult result = ossClient.putObject(bucketName, objectName, inputStream);
Map<String, Object> data = new HashMap<>();
data.put("fileUrl", fileUrlPrefix + objectName);
System.out.println("File " + fileName + " was uploaded successfully to OSS.");
return data;
} catch (OSSException oe) {
System.out.println("Error uploading file " + fileName + " to OSS: " + oe.getMessage());
throw oe;
}
}
2、下载文件
-
生成带有过期时间的 URL,有效期为 3600 秒。这里使用了 ossClient 的 generatePresignedUrl 方法,传入了 bucketName 和 objectName,以及过期时间 expiration。生成的 URL 可以用于临时访问 OSS 对象。
-
将 URL 设置为另存为链接。这里将原 URL 拼接上了一个参数 download,以及文件名 objectName 的 URL 编码版本,用于告诉浏览器将文件另存为。
-
设置 Content-Disposition 响应头。这里设置了 Content-Type 为 application/octet-stream,表示下载的文件是一个二进制流;同时设置 Content-Disposition 为 inline,表示浏览器会直接显示文件内容,并且指定文件名为 objectName 的 URL 编码版本。
-
将用户重定向到另存为链接。这里使用了 response 的 sendRedirect 方法,将下载链接返回给客户端。
-
如果下载失败,会捕获 OSSException 异常,并输出错误信息。
@ApiOperation("下载文件")
@Log(value = "下载文件")
@GetMapping("/download")
public void download(String objectName, HttpServletResponse response) throws IOException {
try {
// 生成带有过期时间的 URL,有效期为 3600 秒
Date expiration = new Date(2694655614L);
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
// 将 URL 设置为另存为链接
String downloadUrl = url.toString() + "&download=" + URLEncoder.encode(objectName, "UTF-8");
// 设置 Content-Disposition 响应头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(objectName, "UTF-8"));
// 将用户重定向到另存为链接
response.sendRedirect(downloadUrl);
System.out.println("Object " + objectName + " was downloaded successfully.");
} catch (OSSException oe) {
System.out.println("Error downloading object " + objectName + ": " + oe.getMessage());
}
}
3、删除文件
在方法体中,先调用ossClient对象的deleteObject方法来删除指定名称的对象。如果删除成功,则打印一条消息表示删除成功;否则,捕获OSSException异常,并打印一条错误消息,其中包含异常的详细信息。
@ApiOperation("删除文件")
@Log(value = "删除文件")
@DeleteMapping("/delete")
public void delete(String objectName) {
try {
ossClient.deleteObject(bucketName, objectName);
System.out.println("Object with name " + objectName + " was deleted successfully.");
} catch (OSSException oe) {
System.out.println("Error deleting object with name " + objectName + ": " + oe.getMessage());
}
}
4、修改文件名称
1.将指定的对象从一个bucket复制到另一个bucket,并将复制后的对象命名为newObjectName。复制操作的结果存储在CopyObjectResult对象中。
2.将新的复制对象的访问权限设置为PublicRead,即公开读取权限。
3.删除原始对象,即将原始对象从bucket中删除。
总体来说,实现了将一个对象从一个bucket复制到另一个bucket,并将访问权限设置为公开,并删除原始对象。
@ApiOperation("修改文件名称")
@Log(value = "修改文件名称")
@DeleteMapping("/renameFile")
public void renameFile(String objectName, String newObjectName) throws OSSException {
try {
// 复制对象并将其设置为公共读取权限
CopyObjectResult result = ossClient.copyObject(bucketName, objectName, bucketName, newObjectName);
ossClient.setObjectAcl(bucketName, newObjectName, CannedAccessControlList.PublicRead);
// 删除原始对象
ossClient.deleteObject(bucketName, objectName);
System.out.println("Object " + objectName + " was renamed to " + newObjectName + " successfully.");
} catch (OSSException oe) {
System.out.println("Error renaming object " + objectName + ": " + oe.getMessage());
}
}
调试
最后打开Swegger2的文档http://localhost:8080/api/doc.html可进行文件的上传、下载、删除及修改文件名称的调试
小知识点
@RequestPart和@RequestParam的区别
@RequestPart
和 @RequestParam
都是 Spring MVC 中用于处理 HTTP 请求参数的注解,但它们的使用场景有所不同。
@RequestParam
注解主要用于处理 URL 参数或表单数据,在 GET 或 POST 请求中都可以使用,其使用方式如下:
@GetMapping("/example")
public void example(@RequestParam("param1") String param1, @RequestParam("param2") int param2) {
// ...
}
在上面的示例代码中, @RequestParam
注解用于将 HTTP 请求中的 param1
和 param2
参数解析为方法参数中的 param1
和 param2
变量。
@RequestPart
注解主要用于处理请求体中的文件上传、JSON 数据等,常用于处理 multipart/form-data 格式数据,在 POST 请求中使用,其使用方式如下:
@PostMapping("/upload")
public void upload(@RequestPart("file") MultipartFile file) {
// ...
}
在上面的示例代码中, @RequestPart
注解用于将 HTTP 请求体中的 file 参数解析为方法参数中的 file 变量。
需要注意的是, @RequestPart
注解常用于处理 multipart/form-data 格式数据,如果请求是 application/json 或其他格式的数据,应该使用 @RequestBody
注解来处理。此外, @RequestPart
还可以与 Swagger 等 API 文档工具一起使用来生成 API 文档。