【问题标题】:Amazon Web Services (AWS) S3 Java create a sub directory (object)Amazon Web Services (AWS) S3 Java 创建子目录(对象)
【发布时间】:2012-07-14 12:47:38
【问题描述】:

我对@9​​87654321@比较熟悉,我也试过浏览对应的Javadoc,但是不知道如何创建子目录,即bucket内的目录对象,以及如何上传文件给它。

假设bucketNamedirName对应于已经存在的bucket(具有公共权限)和一个需要在bucket中创建的新(对象)目录(即bucketName/dirName/)

我尝试了以下方法:

AmazonS3Client s3 = new AmazonS3Client(
    new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
s3.createBucket(bucketName + "/" + dirName); //throws exception

在第二行引发异常。

非常感谢创建子目录并将文件上传到其中的简短 sn-p。

【问题讨论】:

    标签: java amazon-s3 amazon-web-services


    【解决方案1】:

    S3 中没有“子目录”。有桶,桶内有键。

    您可以使用前缀搜索来模拟传统目录。例如,您可以将以下密钥存储在存储桶中:

    foo/bar1
    foo/bar2
    foo/bar3
    blah/baz1
    blah/baz2
    

    然后对foo/进行前缀搜索,你会得到:

    foo/bar1
    foo/bar2
    foo/bar3
    

    更多详情请见AmazonS3.listObjects


    更新:假设您已经有一个现有的存储桶,该存储桶下的键将包含/

    s3.putObject("someBucket", "foo/bar1", file1);
    s3.putObject("someBucket", "foo/bar2", file2);
    ...
    

    然后你可以列出所有以foo/开头的键:

    ObjectListing listing = s3.listObjects("someBucket", "foo/");
    

    【讨论】:

    • 感谢您的回复,能否提供一个简短的 sn-p 代码?正如您在我的帖子中看到的那样,我尝试创建类似 foo/bar 的内容,但它会引发异常。
    【解决方案2】:

    S3 无法以我们在操作系统上执行此操作的传统方式查看目录。 以下是创建目录的方法:

    public static void createFolder(String bucketName, String folderName, AmazonS3 client) {
        // create meta-data for your folder and set content-length to 0
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
    
        // create empty content
        InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
    
        // create a PutObjectRequest passing the folder name suffixed by /
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
                    folderName + SUFFIX, emptyContent, metadata);
    
        // send request to S3 to create folder
        client.putObject(putObjectRequest);
    }
    

    正如卡萨布兰卡所说,您可以将文件上传到这样的目录:

    s3.putObject("someBucket", "foo/bar1", file1);
    

    阅读整个教程here 了解详细信息,最重要的是您将找到如何删除目录的信息。

    【讨论】:

      【解决方案3】:

      在较新版本的 SDK 中,您可以执行以下操作(无需创建空的 InputStream)来创建一个空文件夹:

      String key = parentKey + newFolderName;
      if (!StringUtils.endsWith(key, "/")) {
          key += "/";
      }
      
      PutObjectRequest putRequest = PutObjectRequest.builder()
              .bucket(parent.getBucket())
              .key(key)
              .acl("public-read")
              .build();
      s3Client.putObject(putRequest, RequestBody.empty());
      

      【讨论】:

        【解决方案4】:

        在这里留下这个答案,以防有人偶然发现。我一直在使用 aws sdk 版本 - 1.11.875,以下在尝试将文件上传到 S3 存储桶时成功为我创建了一个文件夹。我不必像前面的答案中提到的那样显式创建文件夹。

        private void uploadFileToS3Bucket(final String bucketName, final File file) {
            final String fileName = "parent/child/" + file.getName();
            final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);
            amazonS3.putObject(putObjectRequest);
        }
        

        这将在指定的 S3 存储桶中创建父文件夹和父/子文件夹,并将文件上传到子文件夹。

        【讨论】:

          【解决方案5】:

          这对我有用。我使用了spring boot和根据Multipart机制上传的文件。我想将我的图像保存在我的 aws s3 存储桶的 photos 文件夹中。我需要像这样保存照片/mypic.jpg

          ----控制器类方法----

          @PostMapping("/uploadFile")
              public String uploadFile(@RequestPart(value = "file") MultipartFile file) throws IOException {
                  return this.amazonClient.uploadFile(file);
          }
          

          ----服务类(控制器的实现)----

           public String uploadFile(MultipartFile multipartFile) throws IOException {
              
                      try {
                          File file = convertMultiPartToFile(multipartFile);
                          String fileName = "photoes/"+generateFileName(multipartFile);  //here give any folder name you want
                          uploadFileTos3bucket(fileName, file);
                      } catch (AmazonServiceException ase) {
                          logger.info("Caught an AmazonServiceException from GET requests, rejected reasons:");
                      }
                      return fileName;
                  }
          

          重点是将你想要的文件夹名称作为文件名的前缀

          另外,我将向您展示如何删除文件夹。关键是将文件夹名称作为keyName(键名称是s3存储桶中上传的对象名称。)。我也会显示代码 sn-p。

          ----控制器类方法----

          @DeleteMapping("/deleteFile")
              public String deleteFile(@RequestPart(value = "keyName") String keyName) {
                  return this.amazonClient.deleteFile(keyName);
              }
          

          ----服务类(控制器的实现)----

           public String deleteFile(String keyName){
                  try {
                      s3client.deleteObject(new DeleteObjectRequest(bucketName, keyName));
                  } catch (SdkClientException e) {
                      e.printStackTrace();
                  }
                  return "deleted file successfully!";
              }
          

          要删除我们创建的照片文件夹,请像这样调用方法。 deleteFile("photos/") 重要:- / 是强制性的

          【讨论】:

            【解决方案6】:

            如果你想创建文件夹,那么你需要使用 put 命令使用以下键来创建 folder1 in:

            在存储桶的根目录 -> folder1/folder1_$folder$

            在文件夹2/folder3/->文件夹2/folder3/folder1/folder1_$folder$

            总是 all_previous_folders/folderName/folderName_$folder$

            【讨论】:

              猜你喜欢
              • 2015-05-01
              • 2015-09-24
              • 1970-01-01
              • 2014-08-31
              • 2014-04-05
              • 1970-01-01
              • 2012-09-04
              • 2016-03-01
              • 1970-01-01
              相关资源
              最近更新 更多