首页 > 其他分享 >Spring boot 集成 S3 进行文件读写删改

Spring boot 集成 S3 进行文件读写删改

时间:2024-08-14 20:49:30浏览次数:10  
标签:String S3 Spring boot file import File public

步骤一:添加依赖

首先,在Spring Boot项目中添加AWS S3相关的依赖。如果你使用Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.17.27</version> <!-- 请根据需要选择最新版本 -->
</dependency>

步骤二:配置AWS凭证和Bucket信息

application.properties中配置AWS凭证和S3 Bucket的信息。

aws.s3.bucketName=your-bucket-name
aws.region=your-region

步骤三:创建S3服务类

创建一个服务类来封装与S3的交互逻辑,包括上传、下载、删除和修改文件的方法。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;

@Service
public class S3Service {

    private final S3Client s3Client;
    private final String bucketName;

    public S3Service(@Value("${aws.s3.bucketName}") String bucketName,
                     @Value("${aws.region}") String region) {
        this.s3Client = S3Client.builder()
                .region(Region.of(region))
                .credentialsProvider(DefaultCredentialsProvider.create())
                .build();
        this.bucketName = bucketName;
    }

    // 上传文件到S3
    public void uploadFile(String keyName, File file) {
        PutObjectRequest request = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .build();

        s3Client.putObject(request, RequestBody.fromFile(file));
    }

    // 从S3下载文件
    public File downloadFile(String keyName) throws IOException {
        GetObjectRequest request = GetObjectRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .build();

        File tempFile = File.createTempFile("s3file-", ".tmp");
        try (FileOutputStream fos = new FileOutputStream(tempFile);
             ResponseInputStream<GetObjectResponse> s3Object = s3Client.getObject(request)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = s3Object.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        }

        return tempFile;
    }

    // 从S3中删除文件
    public void deleteFile(String keyName) {
        DeleteObjectRequest request = DeleteObjectRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .build();

        s3Client.deleteObject(request);
    }

    // 修改S3中的文件(简单地重新上传覆盖)
    public void updateFile(String keyName, File newFile) {
        uploadFile(keyName, newFile);
    }

    // 从S3中读取文件的内容
    public String readFileContent(String keyName) throws IOException {
        File file = downloadFile(keyName);
        return new String(Files.readAllBytes(file.toPath()));
    }
}

步骤四:创建控制器类

创建一个控制器类,用于处理与S3交互的HTTP请求,如文件上传、下载、删除和更新。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@RestController
@RequestMapping("/api/s3")
public class S3Controller {

    private final S3Service s3Service;

    @Autowired
    public S3Controller(S3Service s3Service) {
        this.s3Service = s3Service;
    }

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        try (FileOutputStream fos = new FileOutputStream(convFile)) {
            fos.write(file.getBytes());
        }
        s3Service.uploadFile(file.getOriginalFilename(), convFile);
        return "File uploaded successfully: " + file.getOriginalFilename();
    }

    @GetMapping("/download/{fileName}")
    public String downloadFile(@PathVariable String fileName) throws IOException {
        File file = s3Service.downloadFile(fileName);
        return "File downloaded successfully: " + file.getAbsolutePath();
    }

    @DeleteMapping("/delete/{fileName}")
    public String deleteFile(@PathVariable String fileName) {
        s3Service.deleteFile(fileName);
        return "File deleted successfully: " + fileName;
    }

    @PutMapping("/update")
    public String updateFile(@RequestParam("file") MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        try (FileOutputStream fos = new FileOutputStream(convFile)) {
            fos.write(file.getBytes());
        }
        s3Service.updateFile(file.getOriginalFilename(), convFile);
        return "File updated successfully: " + file.getOriginalFilename();
    }

    @GetMapping("/read/{fileName}")
    public String readFileContent(@PathVariable String fileName) throws IOException {
        return s3Service.readFileContent(fileName);
    }
}

步骤五:启动Spring Boot应用程序

确保所有配置和代码都正确之后,你可以启动Spring Boot应用程序。你可以使用以下命令来启动应用程序:

mvn spring-boot:run

示例操作

  • 上传文件
    通过POST请求上传文件,示例如下:

    curl -X POST -F "file=@/path/to/your/file.txt" http://localhost:8080/api/s3/upload
    
  • 下载文件
    通过GET请求下载文件,示例如下:

    curl -X GET http://localhost:8080/api/s3/download/file.txt
    
  • 删除文件
    通过DELETE请求删除文件,示例如下:

    curl -X DELETE http://localhost:8080/api/s3/delete/file.txt
    
  • 更新文件
    通过PUT请求更新文件,示例如下:

    curl -X PUT -F "file=@/path/to/your/file.txt" http://localhost:8080/api/s3/update
    
  • 读取文件内容
    通过GET请求读取文件内容,示例如下:

    curl -X GET http://localhost:8080/api/s3/read/file.txt
    

以上

标签:String,S3,Spring,boot,file,import,File,public
From: https://www.cnblogs.com/gongchengship/p/18359749

相关文章

  • Spring boot 要监听 S3 上的文件, 当有新文件到来时,下载新文件(SQS 版)
    要在SpringBoot中实现对AWSS3上新文件的监听并自动下载的功能,可以通过以下几种方式实现:1.使用AWSLambda和S3EventNotification配置S3Bucket的事件通知,当有新文件上传到S3时,触发AWSLambda函数。Lambda函数调用SpringBoot应用的API来通知新文件的到来。这种方法需要配......
  • 基于SpringBoot+VUE的学生心理咨询评估系统(源码+文档+部署)
    主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论......
  • 课程设计-基于Springboot+Vue的生鲜交易系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89460525基于SpringBoot+Vue的生鲜交易系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1NzmQFwX8e6una-ykZ6KGww?pwd=wa......
  • 课程设计-基于Springboot+Vue的网上书城的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89461644基于SpringBoot+Vue的网上书城开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1EWMhc80qzi_R__dAXMtKVA?pwd=t8pv......
  • SimpleJarBoot 简单程序启动器
    ​ 介绍Jar包的程序启动器脚本Jar脚本,Jar运行脚本,Jar包脚本,Jar服务启动脚本安装脚本if[-f/usr/bin/curl];thencurl-sSOhttps://gitee.com/wl4837/simple-jar-boot/raw/master/simple-jar-boot.sh;elsewget-Osimple-jar-boot.shhttps://gitee.com/wl4837/sim......
  • 免费【2024】springboot 工资管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 工厂生产设备维护管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • S3 协议 和 OBS的协议的背后故事~
    S3协议英文全称:AmazonSimpleStorageService(亚马逊简单存储服务)就是一种开发的对象传输协议为啥要S3对象存储开发于1990年代中期,主要是为了解决可伸缩性问题。早期开发的传统文件和块存储不具备处理当今生成的大量数据(通常是非结构化且不易组织的数据)的能力。由于......
  • Spring Boot解决循环注入问题
    SpringBoot解决循环依赖注入问题代码问题回显启动错误日志解决方案:使用事件驱动或通过ApplicationContext手动获取Bean1.事件驱动设计2.使用`ApplicationContext`手动获取Bean3.拆分逻辑总结代码问题回显现有代码1在InterestService中依赖MemberInterest......
  • 简单的spring boot tomcat版本升级
    简单的springboottomcat版本升级1.需求我们使用的springboot版本为2.3.8.RELEASE,对应的tomcat版本为9.0.41,公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应,从而可能导致获取其他用户先前请求的数据,造成信息泄露的bug,行方要求对tomcat版本进行升级,受......