AWS S3对象存储

该博客介绍了如何在Java应用中集成AWS S3服务进行文件上传,并通过Nacos配置自定义的AWS访问密钥和存储桶信息。示例代码展示了如何创建AWS凭证,设置S3客户端,并在上传文件时设置公共读取权限。此外,讨论了解决预签名URL有效期限制的两种方案,包括前端实时预签名和开放存储桶权限以获取永久性URL。
摘要由CSDN通过智能技术生成

pom.xml

		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-s3</artifactId>
			<version>1.11.336</version>
		</dependency>

nacos配置自定义参数

aws:
  s3:
    access-key-id: *****
    secret-key: *****
    bucket: ****
    region: ap-east-1
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "aws.s3")
public class AwsS3Properties {

	@ApiModelProperty("accessKeyId")
	private String accessKeyId;
	
	@ApiModelProperty("secretKey")
	private String secretKey;
	
	@ApiModelProperty("储存桶名称")
	private String bucket;
	
	@ApiModelProperty("地区")
	private String region;
}

sevice实现


	@Autowired
	private AwsS3Properties awsS3Properties;


	/**
	 * @param Key  文件唯一名称
	 * @param file 文件
	 * @return 文件地址
	 */
	@Override
	public String uploadToS3(String Key, MultipartFile file) {

		// 通过 accessKeyId、secretKey 生成认证的aws凭证对象
		BasicAWSCredentials credentials = new BasicAWSCredentials(awsS3Properties.getAccessKeyId(), awsS3Properties.getSecretKey());

		// 通过凭证对象 awsCredentials 跟 区域 region 生成s3的服务端(ap-east-1亚太地区香港的区域)
		AmazonS3 s3 = AmazonS3ClientBuilder.standard()
				.withRegion(awsS3Properties.getRegion())
				.withCredentials(new AWSStaticCredentialsProvider(credentials))
				.build();

		// 设置文件元数据
		// contentType: 默认不设置的话是什么ostream什么之类的访问链接的话就会下载文件
		ObjectMetadata metadata = new ObjectMetadata();
//		metadata.setContentType(file.getContentType());
		metadata.setContentLength(file.getSize());
		try {

			// 想要通过公网访问到图片,除了将桶的权限更改之外,还需要设置withCannedAcl(CannedAccessControlList.PublicRead)
			PutObjectRequest putObjectRequest = new PutObjectRequest(
					awsS3Properties.getBucket(), Key, file.getInputStream(), metadata)
					.withCannedAcl(CannedAccessControlList.PublicRead);

			s3.putObject(putObjectRequest);
		} catch (IOException e) {

			log.error(String.format("Upload file [%s] to AWS S3 failed! Error: %s", Key, e.getMessage()));
		} finally {

			s3.shutdown();
		}
		return s3.getUrl(awsS3Properties.getBucket(), Key).toString();
	}
	

注意:S3的储存桶权限默认是阻止公众访问的,也就是说上传图片后返回的地址都是预签名URL并且最长时间7天。
解决方案(当前业务代码为第二种方案)
1 :前端实时返显时需要每次拿桶(bucket)和文件名称预签名一下参考方案
2 :需要开放桶权限,后端代码uploadToS3S对象时设置对象ACL(public-read)。以后URL直接存数据库里,URL没有签名也没有时间限制,直接拿来用就行

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值