我问这个问题是为了回答它,并在我到达那里之前更快地为其他人指出正确的方向。
我花了太长时间寻找答案,因为大多数 S3 对象重定向问题及其答案都与将 S3 存储桶访问点与 S3 网站访问点混淆的技术细节有关。
什么,有不同的网址?
是 -- 请参阅:https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html
一旦你克服了自然路径似乎试图使用对象元数据来设置以下至少一个:
x-amz-website-redirect-location
x-amz-user-website-redirect-location
website-redirect-location
即使您通过 S3 管理门户检查元数据时,API 会静默地将这些更改为website-redirect-location
,这些实际上都不起作用。
当然,可以通过门户轻松编辑 S3 对象的元数据,以将密钥更改为Website-Redirect-Location
,重定向立即开始工作,诱使您认为您几乎做对了......
下一个"明显"的地方是查看是否有另一种方法,类似于在ObjectMetaData上.setContentLength
或.setContentType
的方法
。不,那也不是。
这是一个代码示例,它对我有用:
private void highLevelMultipartUploadWithInfo(TransferManager transferManager, //
String bucketName, String keyName, byte[] fileBytes,
long lastModified, String redirectURL) throws Exception {
String contentType = "text/html";
InputStream inputStream = new ByteArrayInputStream(fileBytes);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(contentType);
metadata.setContentLength(fileBytes.length);
metadata.setLastModified(new java.util.Date(lastModified));
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, keyName, inputStream, metadata)
.withCannedAcl(CannedAccessControlList.PublicRead) //
.withRedirectLocation(redirectURL) //
;
// TransferManager processes all transfers asynchronously,
// so this call returns immediately.
Upload upload = transferManager.upload(putObjectRequest);
// Optionally, wait for the upload to finish before continuing.
upload.waitForCompletion();
}
您实际设置重定向的方式是通过PutObjectRequest
本身。
https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html?com/amazonaws/services/s3/model/PutObjectRequest.html
该(Java(对象上有一个名为:.withRedirectLocation
的方法,它当然接受所需重定向的目标URL。
经过太多小时的搜索,我偶然发现了这里的小宝石:https://github.com/aws/aws-sdk-go/issues/837
当然,一旦你知道怎么做,一切都很容易——对吧?