Spring Boot项目集成AWS S3,实现上传下载功能

AWS S3介绍

下面因为使用到的功能很简单,下面会贴出S3的官网链接,有兴趣的同学可以去自行了解详情

AWS S3(官网):  https://www.amazonaws.cn/s3/
AWS SDK for Java(官网): https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/signup-create-iam-user.html

加入相关的pom文件依赖

不同版本的SDK官网描述会有冲突,暂未遇到相关问题,附上pom依赖版本信息, 只是使用了S3的简单功能,实现文件的上传/下载

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 Java S3-->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.821</version>
        </dependency>

编码思路

S3作为文件存储服务器,想要与S3交互,类似以阿里云的OSS文件存储服务器,有一个简单的客户端去挑起文件上传,调用S3封装的文件上传API实现文件的上传下载

configClient

springboot配置项目 , 此处不做过多赘述.
yaml文件配置
s3:
service.end.point: localhost:8080
accessKey: accessKey
secretKey: secretKey
bucket.name: /filePath

Amazon S3 配置

    @Value("${biz.s3.service.end.point}")
    public String endPoint;

    @Value("${biz.s3.accessKey}")
    public String accessKey;

    @Value("${biz.s3.secretKey}")
    public String secretKey;
    
    /**
     * 初始化生成AmazonS3 客户端配置
     * @return
     */
    @Bean
    public AmazonS3 s3client() {
        log.info("start create s3Client");
        AwsClientBuilder.EndpointConfiguration endpointConfig =
                new AwsClientBuilder.EndpointConfiguration(endPoint,  Region.getRegion(Regions.CN_NORTH_1).getName());

        AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey,secretKey);
        AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);

        AmazonS3 S3client = AmazonS3Client.builder()
                .withEndpointConfiguration(endpointConfig)
                .withClientConfiguration(clientConfig)
                .withCredentials(awsCredentialsProvider)
                .disableChunkedEncoding()
                .withPathStyleAccessEnabled(true)
                .withForceGlobalBucketAccessEnabled(true)
                .build();
        log.info("create s3Client success");
        return  S3client;
    }

注意此处有一个比较坑的地方 clientConfig.setProtocol(Protocol.HTTP): 一定要配置S3的客户端的链接协议,如果未配置此项,会出现上传错误问题,此项的配置用于指定向S3服务器发起的请求方式(http/https) , 初次使用的小伙伴很容易踩坑 ,下面附上错误信息,小伙伴可以根据具体的需要去配置不同的传输协议,还可以配置存活/异常链接等等

com.amazonaws.SdkClientException: Unable to execute HTTP request: Unsupported or unrecognized SSL message
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1207)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1153)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttmeworkServlet.processRequest(FrameworkServlet.java:1005)
Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
	at java.base/sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:439)
	at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:184)
	at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:108)

上传java实现

此处有一个需要注意的细节.withCannedAcl(CannedAccessControlList.PublicRead)) 配置文件的访问路径,因为我这里想直接通过url访问,又不想写在给文件下载再去提供一个接口, 拼接对应的文件路径,实测可用

    @Value("${biz.s3.bucket.name}")
    public String bucketName;

    @Value("${biz.s3.service.end.point}")
    public String endPoint;
    
    @PostMapping(value = "/testList")
    public Result test(@RequestParam(required = true) MultipartFile file){
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(file.getContentType());
        objectMetadata.setContentLength(file.getSize());
        try {
            String key = System.currentTimeMillis() + file.getOriginalFilename();
            PutObjectResult result = amazonS3.putObject(new PutObjectRequest(bucketName, key , file.getInputStream(), objectMetadata)
                    .withCannedAcl(CannedAccessControlList.PublicRead));   //配置文件访问权限
            //文件访问路径
            String url = endPoint + bucketName + "/" + key;
            System.out.println(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.success();
    }

内联此处还有一种方式可以获取文件的访问路径,调用此方法的优点在于,直接拿到key 用户需要下载,可以动态配置访问文件的时间,提高系统的安全性,推荐使用此种方式

    /**
     * 获取文件下载路径
     * @param key 文件的key
     * @return
     */
    private static String downloadFile(String key){
        try {
            if(StringUtils.isEmpty(key)){
                return null;
            }
            GeneratePresignedUrlRequest httpRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, key);
            return s3.generatePresignedUrl(httpRequest).toString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

至此,简单的上传/下载文件至S3已经完成

 部分出现url访问7天有效问题,请参考亚马逊官方文档生成与签名的样式,访问服务器资源
 链接: https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html
  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Spring Boot项目集成AWS SDK,可以实现AWS S3的连接并实现文件的上传和下载功能。 首先,需要在pom.xml文件中添加AWS SDK的依赖项,并确保version保持一致。在dependencyManagement中添加以下代码: ``` <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.0.0-preview-12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 然后,在dependencies中添加以下代码: ``` <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.0.0-preview-12</version> </dependency> ``` 接下来,在application.properties文件中进行配置,包括AWS的访问密钥、S3存储桶名称、存储桶所在地区以及上传文件的路径: ``` aws.access_key_id=your access key aws.secret_access_key=your secret access key aws.s3.bucket=your bucket name aws.s3.region=cn-northwest-1 aws.s3.filename=/666666/test123/photo.zip ``` 在文件上传和下载的方法中,需要注意传递给方法的key参数是指存储在AWS S3上的文件名。如果key参数是路径字符串格式,S3服务器会自动创建对应路径的文件夹。例如,如果在application.properties中设置了aws.s3.filename=/666666/test123/photo.zip,那么key参数为/666666/test123/photo.zip,S3存储桶下就会有一个名为/666666/test123/photo.zip的文件,即上传的文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Boot项目集成AWS SDK连接到AWS S3,实现上传下载功能](https://blog.csdn.net/sinat_27428951/article/details/89675587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值