【问题标题】:Amazon s3 bucket path issueAmazon s3 存储桶路径问题
【发布时间】:2016-05-13 06:06:57
【问题描述】:

我是 amazons3 的新手,我想将文件上传到 s3 存储桶。所以我正在为此用java编写代码,但我不知道如何指定存储桶的路径。任何人都可以帮助我。 请帮助找到获取 s3 存储桶正确路径的解决方案。

public class SampleS3 {

    private static final String SUFFIX = "/";
    private static String existingBucketName = "s3-buckt path";
    private static String AccessKey = "accesskey";
    private static String SecretAccessKey = "SecretAccessKey";
    private static String keyName = "mypic.JPG";
    private static String filePath = "/home/dll files/samplefile.txt";
    private static String amazonFileUploadLocationOriginal = existingBucketName+ "/";


    public static void main(String[] args) throws IOException {

        executeUpload();
    }

    private static void executeUpload() {

        AWSCredentials credentials = new BasicAWSCredentials(AccessKey,
                SecretAccessKey);

        AmazonS3 s3Client = new AmazonS3Client(credentials);
        String folderName = "testfolder";
        createFolder(existingBucketName, folderName, s3Client);
        String fileName = folderName + SUFFIX + "testvideo.mp4";
        s3Client.putObject(new PutObjectRequest(existingBucketName, fileName,
                new File(filePath))
                .withCannedAcl(CannedAccessControlList.PublicRead));
    }

    public static void createFolder(String bucketName, String folderName,
            AmazonS3 client) {
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
        InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
                folderName + SUFFIX, emptyContent, metadata);
        client.putObject(putObjectRequest);
    }

}

当我运行程序时,我得到错误:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: The specified bucket does not exist (Service: Amazon S3; Status Code: 404; Error Code: NoSuchBucket; Request ID: 2D45010A48E44C42), S3 Extended Request ID: c7zzSgYO8bNUh9HoOVVmAbjjtG7G6w5tQmuSIqTmgf3cGqjclTrJS3WIXvPpV7Mt
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)
    at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
    at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1405)
    at com.qagate.s3.amazons3.SampleS3.createFolder(SampleS3.java:65)
    at com.qagate.s3.amazons3.SampleS3.executeUpload(SampleS3.java:45)
    at com.qagate.s3.amazons3.SampleS3.main(SampleS3.java:33)

【问题讨论】:

  • 显示你目前尝试过的代码。
  • 我想知道s3-bucket路径的使用方法
  • 您的存储桶名称有一个空格,我认为这不会飞:docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
  • 实际上“s3-buckt path”这不是存储桶名称,它在S3中的“CVR-TEST”存储桶,但它显示了同样的问题

标签: java amazon-s3


【解决方案1】:

S3 不像 Linux 文件系统。

您的 S3 存储由存储桶组成,这些存储桶在完全平坦的空间中包含对象。 “文件夹”的概念是人为的:键为“foo”的对象与键为“path/to/bar”的对象位于相同的扁平桶命名空间中。没有单独的创建文件夹的步骤;您只需为您的对象提供一个名称包含诸如“/”之类的分隔符的键,您可以通过一些涉及公共前缀的 LIST API 将存储桶视为具有文件夹。

但是,buckets 确实必须创建一次,然后才能将内容存储在其中。除其他事项外,您必须指明哪个区域应托管该存储桶中的对象。

【讨论】:

  • 谢谢,这对我很有帮助,因为我在其中包含了带有存储桶名称而不是密钥的存储桶路径。 :)
【解决方案2】:

您提供的存储桶名称不正确或您没有创建存储桶。

您需要查看有关 Bucket Restriction 的文档。来自文档

  • 存储桶名称的长度必须至少为 3 且不超过 63 个字符。
  • 存储桶名称必须是一系列一个或多个标签。相邻标签由单个句点 (.) 分隔。桶名可以 包含小写字母、数字和连字符。每个标签必须 以小写字母或数字开头和结尾。
  • 存储桶名称不得格式化为 IP 地址(例如, 192.168.5.4)。
  • 当使用带有 SSL 的虚拟托管式存储桶时,SSL 通配符证书仅匹配不包含句点的存储桶。去工作 围绕这一点,使用 HTTP 或编写自己的证书验证逻辑。我们建议您不要在存储桶中使用句点(“.”)
    名字。

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多