Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在授予公共访问权限的情况下将文件上载到AWS S3_Java_Amazon Web Services_Amazon S3_Bucket - Fatal编程技术网

Java 在授予公共访问权限的情况下将文件上载到AWS S3

Java 在授予公共访问权限的情况下将文件上载到AWS S3,java,amazon-web-services,amazon-s3,bucket,Java,Amazon Web Services,Amazon S3,Bucket,我有一个使用公共访问定义的S3存储桶,但是,当我将文件上载到该存储桶中,并且访问URL时,我遇到一个拒绝访问错误: { Region region = Region.EU_WEST_1; S3Client s3 = S3Client.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(r

我有一个使用公共访问定义的S3存储桶,但是,当我将文件上载到该存储桶中,并且访问URL时,我遇到一个拒绝访问错误:

{
    Region region = Region.EU_WEST_1;
        S3Client s3 = S3Client.builder()
                .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                .region(region)
                .build();

        String result = putS3Object(s3, "my-bucket", "pics/15/12345.jpg", "/opt/pics/15/12345.jpg");

        System.out.println(result);


    }

    // snippet-start:[s3.java2.s3_object_upload.main]
    public static String putS3Object(S3Client s3,
            String bucketName,
            String objectKey,
            String objectPath) {

        try {
            PutObjectResponse response = s3.putObject(PutObjectRequest.builder()
                            .bucket(bucketName)
                            .key(objectKey)
                            .build(),
                    RequestBody.fromBytes(getObjectFile(objectPath)));

            return response.eTag();

        } catch (S3Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        return "";
    }

    // Return a byte array
    private static byte[] getObjectFile(String filePath) {

        FileInputStream fileInputStream = null;
        byte[] bytesArray = null;

        try {
            File file = new File(filePath);
            bytesArray = new byte[(int) file.length()];
            fileInputStream = new FileInputStream(file);
            fileInputStream.read(bytesArray);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bytesArray;
    }

这是我在桶中看到的信息:

Objects are the fundamental entities that are stored in Amazon S3. In order for other people to gain access to objects, you will have to explicitly grant them permissions.

我还尝试了API的V2版本,我发现您使用的是S3API的V1版本。尝试使用V2。我从未见过将对象上传到您帐户中的AmazonS3存储桶的问题

试试这个例子:


如果您以前从未使用过V2,我建议您尝试以下快速入门方法:

您的问题可能与以下事实有关:尽管您已配置了bucket的公共访问,但可能是通过取消选中其
阻止公共访问
配置选项中的所有复选框,当您通过配置相应的对象ACL来创建对象时,仍然需要对对象本身进行访问

您可以在put对象操作中正确指示对象的ACL。请考虑以下代码中的修改:

//代码段开始:[s3.java2.s3\u object\u upload.main]
公共静态字符串putS3Object(S3Client s3,
字符串bucketName,
字符串objectKey,
字符串(对象路径){
试一试{
PutObjectResponse=s3.putObject(
PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
//这是重要的修改,设置一个
//为对象预先建立(屏蔽)的公共读取ACL
.acl(ObjectCannedACL.PUBLIC\u READ)
.build(),
fromBytes(getObjectFile(objectPath));
return response.eTag();
}捕获(S3E例外){
System.err.println(e.getMessage());
系统出口(1);
}
返回“”;
}

请参阅和的相关文档。

您在与S3 bucket相同的帐户中使用的IAM角色是否与S3 bucket相同?是的,是相同的accountSide注意:为确保良好的安全性,请勿将AWS凭据放入代码中。相反,请使用AWS CLI
AWS configure
命令将凭据存储在配置文件中。AWS SDK将自动使用这些凭据。然后,您还可以使用AWS CLI使用相同的凭据测试上载(例如
AWS s3 cp 12345.jpg s3://calsada/12345.jpg
)。您能否详细说明“我有一个使用公共访问定义的s3存储桶”的含义?您指的是允许在所有对象上使用S3:GetObject的S3 bucket策略还是其他策略(什么?)