我想使用AmazonAWS TransferManager上传目录。我成功创建了一个包含来自TVM的凭据的AmazonS3Client。
当我尝试用它下载文件时,它会抱怨:
final MultipleFileDownload fileDownloadd=mTransferManager.downloadDirectory(ChanAuth.getBucketName(), remotePath, file);
AWS错误代码:PermanentRedirect,AWS错误消息:您尝试访问的存储区必须使用指定的端点进行寻址。请将以后的所有请求发送到此终端
我已经阅读过这个主题,过去在其他编程语言中经历过这个主题。我记得在发出S3命令时你在最后的“帖子”的位置有关系(我必须直接发布到我的桶URL)。但是错误来自AWS SDK的深层,应该在那里处理。
我的水桶位于EU-WEST-1地区。
我用
初始化客户端s3Client.setRegion(Regions....(Region.EU_WEST_1))
和
s3Client.setEndpoint("s3-eu-west-1.amazonaws.com");
但我总是让TransferManager抱怨。
我怀疑这一定是一个愚蠢的问题,但我会陷入AwS SDK的百万行和方法中。必须在某处正确设置端点,否则sdk不适用于美国以外的存储区。
帮助感谢:)
06-09 20:16:02.810: D/SynchroService(4408): MESSAGE: nicebeat SYNC
06-09 20:16:02.810: D/SynchroService(4408): MESSAGE: downlading from chd68f38e7d1360dc1d999354da4f98601/nicebeat/story/sonidonia to /mnt/sdcard/Android/data/com.regaliz.libneo/files/nicebeat/story/sonidonia/lib
06-09 20:16:02.810: D/SynchroService(4408): is directory? true
06-09 20:16:03.490: W/System.err(4408): AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: 2695AE32DC39077E, AWS Error Code: PermanentRedirect, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., S3 Extended Request ID: j9zQ8EBzkCGHkRTveri82HoA/Yh9PvJofUPtNJlc9oKrVutG0VjNEGG90WnTGaN4
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:633)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:327)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:179)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2980)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2951)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:479)
06-09 20:16:03.490: W/System.err(4408): at com.amazonaws.services.s3.transfer.TransferManager.downloadDirectory(TransferManager.java:588)
06-09 20:16:03.490: W/System.err(4408): at com.regaliz.services.Synchro.downloadDirectory(Synchro.java:156)
06-09 20:16:03.490: W/System.err(4408): at com.regaliz.services.Synchro.request_commands(Synchro.java:99)
06-09 20:16:03.490: W/System.err(4408): at com.regaliz.services.Synchro$3.run(Synchro.java:195)
答案 0 :(得分:1)
您需要设置与创建存储桶的位置匹配的端点。
例如:如果在EU下创建“mybucket”,则对于您正在创建的s3client,应将端点设置为“s3-eu-west-1.amazonaws.com”。
同样,根据您的存储桶的创建位置,您可以根据此页面设置出点:http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
答案 1 :(得分:0)
对于来自不同地区的用户,使用不同的端点可以参考: 的 http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region 强>
如果您不知道您的端点到底是什么,您可以遍历所有端点并尝试每个端点,并在正确的端点上进行归零。
private String[] endPoints = new String[] { "s3.amazonaws.com",
"s3-external-1.amazonaws.com", "s3-us-west-2.amazonaws.com",
"s3-us-west-1.amazonaws.com", "s3-eu-west-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com", "s3-sa-east-1.amazonaws.com" };
private int currentIndex = 0;
protected S3TaskResult upload(String filePath) {
String endPoint = endPoints[currentIndex++];
S3TaskResult result = new S3TaskResult();
// Put the image data into S3.
try {
// s3Client.createBucket(Constants.getPictureBucket());"
s3Client.setEndpoint(endPoint);
// Content type is determined by file extension.
PutObjectRequest por = new PutObjectRequest(
Constants.getPictureBucket(), Constants.PICTURE_NAME,
new java.io.File(filePath));
por.setProgressListener(this);
s3Client.putObject(por);
Log.d("S3","SUCCESSFUL ENDPOINT : "+endPoint); // GOT IT!!
} catch (Exception exception) {
if (currentIndex < endPoints.length) {
upload(filePath);
}
exception.printStackTrace();
}
return result;
}