AWS S3 踩坑
第一次用S3,记录一下
1. Key在哪里
- IAM 设置一个用户组,权限勾选S3 的选项
- 生成一个专属用户, 划分到用户组
- 用户处生成密钥,那AccessKey 和 SecretKey
2. 桶策略配置
1 | { |
3. Spring Boot怎么连接
- Maven 找到AWS SDK S3 导入
1
2
3
4
5
6<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.696</version>
</dependency> - application 填写Region,两个Key
1
2
3
4
5
6amazon:
s3:
accessKey:
secretKey:
region:
bucketName: - 构建单例工具类
1 | /** |
4. 公网访问文件,是否必须关闭网络访问
屏蔽公共访问权限(存储桶设置) 阻止所有公开访问,获取授权访问可以调用 generatePresignedUrl 但是有时效,S3 SDK获取公网链接,最长7天
5. 使用时遇到的坑
本来想构建几个目录,划分不同职责,之前公司华为云、阿里云上都可以这么做,但是S3 这里有问题,我可以在bucket下增删除查改数据,但是如果我新建目录 image/ 再在这个目录下进行数据CURD操作,则报 SignatureDoesNotMatch
错误.
1 | <Code>SignatureDoesNotMatch</Code> |
我一直以为是我Key有问题,因为一开始我测试文件是放bucket下的,新增目录肯定是我的问题,但是后面在github上发现有人说,配置目录后就是会这样的。
规避方法
文件名添加UUID前缀,放在bucket下。
如果有其他方法,请告知我,谢谢。
其他记录
- MultipartFile 中文名乱码,用ISO_8859_1 读取文件名并使用UTF8记录
1
2
3
4
5
6
7
8
9public static String getFileName(MultipartFile file) {
try {
// 尝试解码
return new String(Objects.requireNonNull(file.getOriginalFilename()).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
} catch (Exception e) {
// 返回原名
return file.getOriginalFilename();
}
}