我使用 Java 在 Amazon AWS S3存储桶上传图像文件。
我正在使用以下maven依赖 -
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.9.28.1</version>
</dependency>
我可以上传文件,也可以下载内容。但我想将图片网址返回给用户。
如何在s3存储桶上传后立即获取图片网址?
这是我的java代码 -
public void uploadProfile(InputStream fileInputStream, String fileName) {
AmazonS3 s3client = new AmazonS3Client(new BasicAWSCredentials("MY-ACCESS-KEY", "MY-SECRET-KEY"));
String bucketName = "MyBucket";
String key = "MyKey";
try {
System.out.println("Listing buckets");
for (Bucket bucket : s3client.listBuckets()) {
System.out.println(" - " + bucket.getName());
}
System.out.println();
System.out.println("Uploading a new object to S3 from a file\n");
s3client.putObject(new PutObjectRequest(bucketName, key, fileInputStream, new ObjectMetadata()).withCannedAcl(CannedAccessControlList.PublicRead));
System.out.println("Downloading an object");
S3Object object = s3client.getObject(new GetObjectRequest(bucketName, key));
System.out.println("Content-Type: " + object.getObjectMetadata().getContentType());
displayTextInputStream(object.getObjectContent());
System.out.println("Listing objects");
ObjectListing objectListing = s3client.listObjects(new ListObjectsRequest()
.withBucketName(bucketName)
.withPrefix("My"));
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" - " + objectSummary.getKey() + " " +
"(size = " + objectSummary.getSize() + ")");
}
System.out.println();
} catch (AmazonServiceException ase) {
System.out.println("Error Message: " + ase.getMessage());
ase.printStackTrace();
} catch (AmazonClientException ace) {
System.out.println("Error Message: " + ace.getMessage());
ace.printStackTrace();
}
}
private static void displayTextInputStream(InputStream input) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println(" " + line);
}
System.out.println();
}
我试图点击网址:https://MyBucket.s3.amazonaws.com/myfilename
但它在xml中显示消息为 -
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>64358C14C976A2CB</RequestId>
<HostId>
ZQ+DAaocOLxR/TmfEMGLcYm4Zk4Kl1vCKjciYiXKF1gYH5Lhj6oM4rd/o/4+SLVb
</HostId>
</Error>
那么如何在上传s3存储桶后立即获取图片网址?
答案 0 :(得分:1)
这是一个安全错误。您很有可能使用了良好的网址,但您无权访问该文件。您需要更改下载权限:每个人。然后,任何人都可以通过互联网访问该文件。 如果您不想这样做,那么您可以设置不同的权限,例如:经过身份验证的用户,然后您就可以从连接了正确的IAM用户的EC2实例访问该文件。
答案 1 :(得分:0)
您需要点击S3存储桶中的特定文件,并暂时选择公开选项。它可以从任何地方访问。