Java com.amazonaws.services.s3.model.amazons3异常:必须指定用户密钥

Java com.amazonaws.services.s3.model.amazons3异常:必须指定用户密钥,java,amazon-s3,Java,Amazon S3,代码如下所示: 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.A

代码如下所示:

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)
访问/密钥设置正确


用户密钥是什么?

如果URL比密钥长,您将提交一个长度超过密钥大小的数组,其中包含空条目,这可能会导致异常(我自己没有尝试过)

您可能需要:

client.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys.toArray(new String[urls.length]))
什么是用户密钥?

Ans:

用户密钥是用户可以通过其获取凭据的密钥
它验证您是谁,以及您是否有权访问您请求的资源
。用户安全凭据具有
访问密钥ID
秘密访问密钥

您必须将密钥存储在安全的位置。你的秘密钥匙不会被破解 可通过AWS管理控制台获得更多信息;你会有 唯一的副本。为保护您的帐户,请对其保密, 永远不要发电子邮件。不要在组织外共享,即使 一项调查似乎来自AWS或Amazon.com。没有人合法地 表示亚马逊将永远向您索要您的密钥

更多信息:

您的
client.deleteObjects(…)方法具有使用数组处理的键。但是下面使用
ArrayList
删除具有
正确异常处理的对象

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

  • 创建
    AmazonS3Client
    类的实例
  • 创建
    DeleteObjectsRequest
    类的实例并提供
    对象键列表
    以及可选的对象版本ID 您要删除的

    如果指定要删除的对象的版本ID,
    Amazon S3将删除特定的对象版本。如果未指定要删除的对象的版本ID,
    Amazon S3会添加删除标记。有关详细信息,请参阅

  • 执行
    AmazonS3Client.deleteObjects
    方法
  • 下面的Java代码示例演示了前面的步骤

    client.deleteObjects(new DeleteObjectsRequest(bucketName)
        .withKeys(keys.toArray(new String[keys.length]))
    --------------------------------------^^^^
    
    List key=new ArrayList();
    //提供对象键和版本的列表。
    DeleteObjectsRequest multiObjectDeleteRequest=新的DeleteObjectsRequest(bucketName)
    .带钥匙(钥匙);
    试一试{
    DeleteObjectsResult delObjRes=s3Client.deleteObjects(multiObjectDeleteRequest);
    System.out.format(“已成功删除所有%s项。\n”,delObjRes.getDeletedObjects().size());
    }捕获(多对象删除异常){
    //进程异常。
    }
    
    对于多对象删除(非版本化存储桶),可以使用此方法 也

    static void multiObjectNonVersionedDelete(列表键){
    //通过仅指定键(无版本ID)进行多对象删除。
    DeleteObjectsRequest multiObjectDeleteRequest=新的DeleteObjectsRequest(
    bucketName)。withQuiet(假);
    //创建仅包含对象键名称的请求。
    List justKeys=new ArrayList();
    用于(密钥版本密钥:密钥){
    add(新的KeyVersion(key.getKey());
    }
    multiObjectDeleteRequest.setKeys(justKeys);
    //执行DeleteObjects-Amazon S3为每个对象添加删除标记
    //删除。对象不会从您的bucket中消失(验证)。
    DeleteObjectsResult delObjRes=null;
    试一试{
    delObjRes=s3Client.deleteObjects(multiObjectDeleteRequest);
    System.out.format(“已成功删除所有%s项。\n”,delObjRes.getDeletedObjects().size());
    }捕获(MultiObjectDeleteException模式){
    打印删除结果(模式);
    }
    }
    
    有关示例的详细信息,您可以按照教程进行操作


  • 我应该澄清一下,这一切都是用另一种语言发生的,Go,从那时起就已经澄清了。不确定这是否是AWS问题,但我没有更改任何内容,它又开始工作了。@sberry在我的例子中,应用程序的配置中有一些错误,密钥的属性名包含一些奇怪的字符。因此,如果是配置本身的问题。也许你也面临同样的问题——有人对配置做了一些修改,然后又恢复了更改。如果你放弃了对我答案的投票权,那么我可以知道我被解释了什么问题吗?
    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);
        }
    }