[英]com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied
[英]com.amazonaws.services.s3.model.AmazonS3Exception: User key must be specified
com.amazonaws.services.s3.model.AmazonS3Exception: User key must be specified. (Service: Amazon S3; Status Code: 400;
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1160)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:748)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:467)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:302)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3769)
at com.amazonaws.services.s3.AmazonS3Client.deleteObjects(AmazonS3Client.java:1841)
代码如下所示:
client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys.toArray(new String[urls.length]))
访问/密钥设置正确。
什么是用户密钥 ?
什么是用户密钥?
答:
用户密钥是用户可以获取凭据的密钥。 It verifies who you are and whether you have permission to access the resources that you are requesting
。 用户安全凭证具有Access Key ID
和Secret Access Key
。
您必须将密钥存储在安全的位置。 您的密钥将不再通过AWS管理控制台提供; 你将拥有唯一的副本。 保密,以保护您的帐户,绝不发送电子邮件。 即使查询似乎来自AWS或Amazon.com,也不要在您的组织外共享。 合法代表亚马逊的任何人都不会要求您提供密钥。
更多信息: http : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html
你的client.deleteObjects(....);
方法具有使用数组处理的键。 但是下面使用ArrayList
来删除具有proper exception handling
对象。
删除多个对象(启用版本的存储桶)
AmazonS3Client
类的实例。 创建DeleteObjectsRequest
类的实例,并提供list of objects keys
以及可选择要删除的对象的版本ID。
如果指定要删除的对象的版本ID, Amazon S3 deletes the specific object version
。 如果未指定要删除的对象的版本ID,则Amazon S3 adds a delete marker
。 有关更多信息,请参阅删除每个请求一个对象 。
AmazonS3Client.deleteObjects
方法。 以下Java代码示例演示了上述步骤。
List<KeyVersion> keys = new ArrayList<KeyVersion>();
// Provide a list of object keys and versions.
DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(bucketName)
.withKeys(keys);
try {
DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest);
System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size());
} catch (MultiObjectDeleteException e) {
// Process exception.
}
对于多对象删除(非版本化存储桶),您也可以使用此方法
static void multiObjectNonVersionedDelete(List<KeyVersion> keys) {
// Multi-object delete by specifying only keys (no version ID).
DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(
bucketName).withQuiet(false);
// Create request that include only object key names.
List<KeyVersion> justKeys = new ArrayList<KeyVersion>();
for (KeyVersion key : keys) {
justKeys.add(new KeyVersion(key.getKey()));
}
multiObjectDeleteRequest.setKeys(justKeys);
// Execute DeleteObjects - Amazon S3 add delete marker for each object
// deletion. The objects no disappear from your bucket (verify).
DeleteObjectsResult delObjRes = null;
try {
delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest);
System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size());
} catch (MultiObjectDeleteException mode) {
printDeleteResults(mode);
}
}
有关示例的详细信息,您可以按照教程进行操作
如果url比key长,你将提交一个数组,该数组的长度大于带有空条目的键的大小,这可能会导致异常(我自己没试过)。
你可能想要:
client.deleteObjects(new DeleteObjectsRequest(bucketName)
.withKeys(keys.toArray(new String[keys.length]))
--------------------------------------^^^^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.