Java 在授予公共访问权限的情况下将文件上载到AWS S3
我有一个使用公共访问定义的S3存储桶,但是,当我将文件上载到该存储桶中,并且访问URL时,我遇到一个拒绝访问错误:Java 在授予公共访问权限的情况下将文件上载到AWS S3,java,amazon-web-services,amazon-s3,bucket,Java,Amazon Web Services,Amazon S3,Bucket,我有一个使用公共访问定义的S3存储桶,但是,当我将文件上载到该存储桶中,并且访问URL时,我遇到一个拒绝访问错误: { Region region = Region.EU_WEST_1; S3Client s3 = S3Client.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(r
{
Region region = Region.EU_WEST_1;
S3Client s3 = S3Client.builder()
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.region(region)
.build();
String result = putS3Object(s3, "my-bucket", "pics/15/12345.jpg", "/opt/pics/15/12345.jpg");
System.out.println(result);
}
// snippet-start:[s3.java2.s3_object_upload.main]
public static String putS3Object(S3Client s3,
String bucketName,
String objectKey,
String objectPath) {
try {
PutObjectResponse response = s3.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build(),
RequestBody.fromBytes(getObjectFile(objectPath)));
return response.eTag();
} catch (S3Exception e) {
System.err.println(e.getMessage());
System.exit(1);
}
return "";
}
// Return a byte array
private static byte[] getObjectFile(String filePath) {
FileInputStream fileInputStream = null;
byte[] bytesArray = null;
try {
File file = new File(filePath);
bytesArray = new byte[(int) file.length()];
fileInputStream = new FileInputStream(file);
fileInputStream.read(bytesArray);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bytesArray;
}
这是我在桶中看到的信息:
Objects are the fundamental entities that are stored in Amazon S3. In order for other people to gain access to objects, you will have to explicitly grant them permissions.
我还尝试了API的V2版本,我发现您使用的是S3API的V1版本。尝试使用V2。我从未见过将对象上传到您帐户中的AmazonS3存储桶的问题 试试这个例子:
如果您以前从未使用过V2,我建议您尝试以下快速入门方法:您的问题可能与以下事实有关:尽管您已配置了bucket的公共访问,但可能是通过取消选中其
阻止公共访问
配置选项中的所有复选框,当您通过配置相应的对象ACL来创建对象时,仍然需要对对象本身进行访问
您可以在put对象操作中正确指示对象的ACL。请考虑以下代码中的修改:
//代码段开始:[s3.java2.s3\u object\u upload.main]
公共静态字符串putS3Object(S3Client s3,
字符串bucketName,
字符串objectKey,
字符串(对象路径){
试一试{
PutObjectResponse=s3.putObject(
PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
//这是重要的修改,设置一个
//为对象预先建立(屏蔽)的公共读取ACL
.acl(ObjectCannedACL.PUBLIC\u READ)
.build(),
fromBytes(getObjectFile(objectPath));
return response.eTag();
}捕获(S3E例外){
System.err.println(e.getMessage());
系统出口(1);
}
返回“”;
}
请参阅和的相关文档。您在与S3 bucket相同的帐户中使用的IAM角色是否与S3 bucket相同?是的,是相同的accountSide注意:为确保良好的安全性,请勿将AWS凭据放入代码中。相反,请使用AWS CLI
AWS configure
命令将凭据存储在配置文件中。AWS SDK将自动使用这些凭据。然后,您还可以使用AWS CLI使用相同的凭据测试上载(例如AWS s3 cp 12345.jpg s3://calsada/12345.jpg
)。您能否详细说明“我有一个使用公共访问定义的s3存储桶”的含义?您指的是允许在所有对象上使用S3:GetObject的S3 bucket策略还是其他策略(什么?)