使用阿里云OSS实现文件的上传、下载、删除及修改功能

一、配置OSS相关配置信息

1、要配置 OSS 相关配置信息,您可以按照以下步骤操作:

  1. 登录阿里云控制台,进入 OSS 控制台,创建一个新的 OSS Bucket,并记录下以下信息:Bucket 名称、Bucket 所属地域、AccessKey ID、Access Key Secret。
  2. 在您的 Java 项目中添加阿里云 Java SDK 依赖。您可以在项目的 pom.xml 配置文件中添加以下依赖项:
<dependency>
       <groupId>com.aliyun.oss</groupId>
       <artifactId>aliyun-sdk-oss</artifactId>
       <version>3.13.1</version>
   </dependency>
  1. 在您的 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、上传文件

  1. 方法名为upload,返回类型为Map<String, Object>,参数为MultipartFile类型的file对象,该对象代表上传的文件。

  2. 通过调用file对象的getOriginalFilename()方法获取上传文件的原始文件名,并将其赋值给fileName变量。

  3. 使用UUID生成一个唯一的对象名称objectName,以保证上传的文件不会覆盖已有的文件。objectName的值由UUID和文件后缀名组成,例如:f6d8b25a-d6b0-4b7b-8d6a-0e1f7c1a3a9a.jpg。

  4. 通过file.getInputStream()方法获取上传文件的InputStream对象,使用该对象来上传文件到OSS中。

  5. 调用阿里云Java SDK提供的putObject方法上传文件,并将上传结果赋值给result变量。

  6. 将上传文件的URL地址和文件名放入HashMap对象data中,其中fileUrlPrefix是OSS中存储文件的URL前缀,例如:https://my-bucket.oss-cn-hangzhou.aliyuncs.com/。

  7. 打印上传成功的信息,返回data对象。

  8. 如果上传过程出现异常,将异常信息打印出来,并抛出该异常。

@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、下载文件

  1. 生成带有过期时间的 URL,有效期为 3600 秒。这里使用了 ossClient 的 generatePresignedUrl 方法,传入了 bucketName 和 objectName,以及过期时间 expiration。生成的 URL 可以用于临时访问 OSS 对象。

  2. 将 URL 设置为另存为链接。这里将原 URL 拼接上了一个参数 download,以及文件名 objectName 的 URL 编码版本,用于告诉浏览器将文件另存为。

  3. 设置 Content-Disposition 响应头。这里设置了 Content-Type 为 application/octet-stream,表示下载的文件是一个二进制流;同时设置 Content-Disposition 为 inline,表示浏览器会直接显示文件内容,并且指定文件名为 objectName 的 URL 编码版本。

  4. 将用户重定向到另存为链接。这里使用了 response 的 sendRedirect 方法,将下载链接返回给客户端。

  5. 如果下载失败,会捕获 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 请求参数的注解,但它们的使用场景有所不同。

  1. @RequestParam 注解主要用于处理 URL 参数或表单数据,在 GET 或 POST 请求中都可以使用,其使用方式如下:
@GetMapping("/example")
public void example(@RequestParam("param1") String param1, @RequestParam("param2") int param2) {
    
    
    // ...
}

在上面的示例代码中, @RequestParam 注解用于将 HTTP 请求中的 param1param2 参数解析为方法参数中的 param1param2 变量。

  1. @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 文档。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45442178/article/details/130827543