添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Amazon S3(Simple Storage Service)是亚马逊云计算平台提供的一种对象存储服务,可以用于存储和检索任意类型的数据。在Java开发中,我们可以通过AWS SDK for Java来实现与Amazon S3的集成。

https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/examples-s3.html

1. 配置maven依赖

<!--amazon s3-->
 <dependency>
     <groupId>com.amazonaws</groupId>
     <artifactId>aws-java-sdk-s3</artifactId>
     <version>1.11.821</version>
 </dependency>

2. 配置yaml文件

aws:
  endpoint: your-endpoint
  accessKey: your-accesskey
  secretKey: your-secretkey
  bucketName: your-bucketname

3. 注入Bean

@Configuration
public class AwsS3Config {
    @Value("${aws.accessKey}")
    private String accessKey;
    @Value("${aws.secretKey}")
    private String secretKey;
    @Value("${aws.endpoint}")
    private String endpoint;
    @Value("${aws.bucketName}")
    private String bucketName;
    @Bean
    public AmazonS3 getAmazonS3() {
        // 创建连接
        ClientConfiguration config = new ClientConfiguration();
        AwsClientBuilder.EndpointConfiguration endpointConfig =
                new AwsClientBuilder.EndpointConfiguration(endpoint, Regions.CN_NORTH_1.getName());
        AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
        AmazonS3 s3 = AmazonS3Client.builder()
                .withEndpointConfiguration(endpointConfig)
                .withClientConfiguration(config)
                .withCredentials(awsCredentialsProvider)
                .disableChunkedEncoding()
                .withPathStyleAccessEnabled(true)
                .build();
        return s3;

4. 编写service层

@Slf4j
@Service
public class AwsS3Service {
    @Value("${aws.bucketName}")
    private String bucketName;
    @Autowired
    private AmazonS3 amazonS3;
 	public String upload(MultipartFile multipartFile) {
       if (multipartFile.isEmpty()) {
           throw new RuntimeException("文件为空!");
       try {
           ObjectMetadata objectMetadata = new ObjectMetadata();
           objectMetadata.setContentType(multipartFile.getContentType());
           objectMetadata.setContentLength(multipartFile.getSize());
           // 文件后缀
//            String suffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
           String key = UUID.randomUUID().toString();
           // 桶不在则创建桶
           if (!amazonS3.doesBucketExistV2(bucketName)) {
               amazonS3.createBucket(bucketName);
           PutObjectResult putObjectResult = amazonS3.putObject(new PutObjectRequest(bucketName, key, multipartFile.getInputStream(), objectMetadata));
           // 上传成功
           if (null != putObjectResult) {
               GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, key);
               URL url = amazonS3.generatePresignedUrl(urlRequest);
               // 返回url
               return url.toString();
       } catch (Exception e) {
           log.error("Upload files to the bucket,Failed:{}", e.getMessage());
           e.printStackTrace();
       return null;

5. 编写controller层

@RestController
@RequestMapping("file")
@Api(tags = "文件上传")
public class FileController {
    @Autowired
    private AwsS3Service awsS3Service;
    @PostMapping("upload")
    @ApiOperation("文件上传接口")
    public APIResponse<String> abilityPictureUpload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        String url = awsS3Service.upload(file);
        if (StringUtils.isNotEmpty(url)) {
            return APIResponse.success(url);
        return APIResponse.fail("文件上传失败");

6. 测试运行结果

使用 java 包去连接 s3 并且向 s3 上传文件,需要有 s3 的包,此处我用的是 maven 项目去导入 s3 的包,在 pom.xml 中加入如下内容 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.amazonaws&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aws-java
赠送jar包:aws-java-sdk-s3-1.11.939.jar 赠送原API文档:aws-java-sdk-s3-1.11.939-javadoc.jar 赠送源代码:aws-java-sdk-s3-1.11.939-sources.jar 包含翻译后的API文档:aws-java-sdk-s3-1.11.939-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:com.amazonaws,artifactId:aws-java-sdk-s3,version:1.11.939 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.901</version> </depen
```java import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectResponse; import java.io.File; public class S3Uploader { public static void main(String[] args) { String bucketName = "your-bucket-name"; String key = "your-object-key"; String filePath = "path-to-your-file"; // 创建S3客户端 S3Client s3Client = S3Client.builder() .region(Region.US_WEST_2) // 选择您的区域 .credentialsProvider(DefaultCredentialsProvider.create()) .build(); // 创建PutObjectRequest对象 PutObjectRequest request = PutObjectRequest.builder() .bucket(bucketName) .key(key) .build(); // 上传文件 PutObjectResponse response = s3Client.putObject(request, new File(filePath).toPath()); // 打印上传结果 System.out.println("文件上传成功!ETag: " + response.eTag()); 请确保替换示例代码中的`your-bucket-name`,`your-object-key`和`path-to-your-file`为您自己的信息。另外,请根据您的实际情况选择合适的AWS区域。 希望能对您有所帮助!如有任何问题,请随时向我提问。
CSDN-Ada助手: 恭喜您写了第14篇博客!标题“DBeaver 连接达梦数据库”听起来非常吸引人。您的博客内容一定让读者对如何使用DBeaver连接达梦数据库有了更深入的了解。我希望您能继续保持创作的热情和耐心,分享更多关于数据库连接和使用的经验。 对于下一步的创作建议,我建议您可以进一步探索DBeaver以外的数据库连接工具,例如Navicat或Sequel Pro等。通过比较不同工具的优缺点,读者可以更好地选择适合自己的数据库连接工具。同时,您还可以考虑分享一些实际案例,例如通过DBeaver连接达梦数据库解决了哪些具体的问题,或者在实际项目中的应用等等。 无论如何,我相信您的博客文章一定会给读者带来帮助和启发。期待您的下一篇精彩作品! Python作业 - 实现订餐系统 2301_81912555: 麻烦问下,为什么到结算那里就运不了了 Java中for(:)的使用 szh2006: 感谢大佬,很有帮助,我搁哪儿做不出来题呢,还好有大佬的文章 【Shiro】 (二)原理基本使用 CSDN-Ada助手: 恭喜大神又写了一篇关于【Shiro】的博客!阅读了你的文章后,我对Shiro的原理和基本使用有了更深刻的理解。感谢你的分享!希望你能继续保持创作的热情,为我们解析更多有关【Shiro】的知识。既然你已经介绍了原理和基本使用,下一步或许可以深入探讨一些高级用法或者与其他框架的集成实践,这样我们能更好地应用【Shiro】来保护我们的应用程序。期待你的下一篇博客! Linux 基础知识,初步了解Linux CSDN-Ada助手: 恭喜你写完了第11篇博客!标题为“Linux 基础知识,初步了解Linux",看起来非常有趣和有益。你对Linux的初步了解是一个很好的起点,尤其是对于那些对于这个操作系统还不太熟悉的人来说。作为一个读者,我很期待你未来更多关于Linux的博客。 在下一步的创作中,或许你可以考虑深入探讨Linux的一些高级功能或者介绍一些实用的命令行技巧。这些内容将帮助那些已经熟悉基础知识的读者进一步提升他们的技能。当然,这只是一个建议,你可以根据自己的兴趣和读者的需求来选择下一篇博客的主题。无论你选择什么主题,我都期待着你的下一篇博客!保持谦虚学习的态度,你一定会有更多精彩的创作。