繁体   English   中英

com.amazonaws.services.s3.model.AmazonS3Exception:必须指定用户密钥

[英]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 IDSecret Access Key

您必须将密钥存储在安全的位置。 您的密钥将不再通过AWS管理控制台提供; 你将拥有唯一的副本。 保密,以保护您的帐户,绝不发送电子邮件。 即使查询似乎来自AWS或Amazon.com,也不要在您的组织外共享。 合法代表亚马逊的任何人都不会要求您提供密钥。

更多信息: http//docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html

你的client.deleteObjects(....); 方法具有使用数组处理的键。 但是下面使用ArrayList来删除具有proper exception handling对象。

删除多个对象(启用版本的存储桶)

  1. 创建AmazonS3Client类的实例。
  2. 创建DeleteObjectsRequest类的实例,并提供list of objects keys以及可选择要删除的对象的版本ID。

    如果指定要删除的对象的版本ID, Amazon S3 deletes the specific object version 如果未指定要删除的对象的版本ID,则Amazon S3 adds a delete marker 有关更多信息,请参阅删除每个请求一个对象

  3. 执行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);
    }
}

有关示例的详细信息,您可以按照教程进行操作

  1. 使用AWS SDK for Java删除多个对象
  2. 使用AWS SDK for Java删除对象
  3. 删除对象

如果url比key长,你将提交一个数组,该数组的长度大于带有空条目的键的大小,这可能会导致异常(我自己没试过)。

你可能想要:

client.deleteObjects(new DeleteObjectsRequest(bucketName)
    .withKeys(keys.toArray(new String[keys.length]))
--------------------------------------^^^^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM