【问题标题】:AWS S3 Java SDK - Download file helpAWS S3 Java SDK - 下载文件帮助
【发布时间】:2011-10-17 17:03:28
【问题描述】:

以下代码仅适用于从 S3 中的存储桶下载文本文件。这不适用于图像。有没有更简单的方法来使用 AWS 开发工具包管理下载/类型?文档中包含的示例并不明显。谢谢!

AWSCredentials myCredentials = new BasicAWSCredentials(
       String.valueOf(Constants.act), String.valueOf(Constants.sk)); 
AmazonS3Client s3Client = new AmazonS3Client(myCredentials);        
S3Object object = s3Client.getObject(new GetObjectRequest("bucket", "file"));

BufferedReader reader = new BufferedReader(new InputStreamReader(
       object.getObjectContent()));
File file = new File("localFilename");      
Writer writer = new OutputStreamWriter(new FileOutputStream(file));

while (true) {          
     String line = reader.readLine();           
     if (line == null)
          break;            

     writer.write(line + "\n");
}

writer.close();

【问题讨论】:

  • 我必须做的事情并尝试你的代码,但找不到 jar 你能建议使用哪个 jar。目前我正在使用 aws-android-sdk-2.1.5-s3.jar jar 但不是找到所有类。
  • 您知道如何将文件上传到亚马逊。我正在使用您的代码下载文件,并且运行良好。

标签: java amazon-s3 download amazon java-web-start


【解决方案1】:

尽管 Mauricio 的回答中编写的代码可以正常工作——他关于流的观点当然是正确的——亚马逊提供了一种更快的方法来将文件保存在他们的 SDK 中。我不知道它是否在 2011 年不可用,但现在可用。

AmazonS3Client s3Client = new AmazonS3Client(myCredentials);

File localFile = new File("localFilename");

ObjectMetadata object = s3Client.getObject(new GetObjectRequest("bucket", "s3FileName"), localFile);

【讨论】:

  • 需要小修改:对象内容保存到文件中,但返回的对象是ObjectMetadata,而不是S3Object。见docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/…
  • @azdev 实际上,代码示例使用了a different version of getObject,它确实返回了一个 S3Object。
  • 为什么我在我的代码中看不到 S3Client.getObject 方法?..我想实现同样的效果,但没有与我的 s3Client 对象关联的这种方法。我错过了什么吗?
  • @ShikhaShah 返回 S3Object 的 getObject 方法来自 AmazonS3 interface,由 AmazonS3Client 实现。也许您的 IDE 没有显示从接口继承的方法?
  • 但是我只能通过 AmazonS3Client 下载文件并保存它...但是看不到这种加快保存过程的特殊方法..m 仍然很困惑!!
【解决方案2】:

您应该使用 InputStreamOutputStream 类,而不是 ReaderWriter 类:

InputStream reader = new BufferedInputStream(
   object.getObjectContent());
File file = new File("localFilename");      
OutputStream writer = new BufferedOutputStream(new FileOutputStream(file));

int read = -1;

while ( ( read = reader.read() ) != -1 ) {
    writer.write(read);
}

writer.flush();
writer.close();
reader.close();

【讨论】:

  • 这工作.. aws 文档列出的程序不起作用。这工作得很好。感谢您发帖
【解决方案3】:

Eyals 的回答让你成功了一半,但并不是那么清楚,所以我会澄清一下。

AmazonS3Client s3Client = new AmazonS3Client(myCredentials);

//This is where the downloaded file will be saved
File localFile = new File("localFilename");

//This returns an ObjectMetadata file but you don't have to use this if you don't want 
s3Client.getObject(new GetObjectRequest(bucketName, id.getId()), localFile);

//Now your file will have your image saved 
boolean success = localFile.exists() && localFile.canRead(); 

【讨论】:

  • id.getId()) 你用了什么?
  • id.getId() 是您用来在存储桶中存储对象的密钥。我只使用我的 id 作为密钥,因为我知道它是独一无二的。总而言之,您创建一个空文件,执行 getRequest 告诉 aws api 新的空文件在哪里,然后 aws api 处理将对象写入您指定的文件。太方便了。
  • @ShawnVader :请您清楚为什么要验证文件。我虽然 S3 api 会进行哈希检查。谢谢。
  • @saurabheights 你是对的,上面检查文件的例子可能会返回不正确的结果,因为在上述情况下 localFile 存在是可以接受的。也许更好的方法是确保返回的 ObjectMetadata 不为空。文档说 > 返回指定对象的所有 S3 对象元数据。如果指定但未满足约束,则返回 null。因此,如果它有元数据,那么您可以确信它是文件中的有效内容,因为通过查看 AWS 源,我可以看到它验证了文件完整性,并且会在失败前重试一次。
  • @ShawnVader:已编辑答案,请在同行评审后进行审核。
【解决方案4】:

还有更简单的方法可以得到这个。我在sn-p下面使用。从http://docs.ceph.com/docs/mimic/radosgw/s3/java/得到参考

AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(Regions.US_EAST_1).build();

s3client.getObject(
                new GetObjectRequest("nomad-prop-pics", "Documents/1.pdf"),
                new File("D:\\Eka-Contract-Physicals-Dev\\Contracts-Physicals\\utility-service\\downlods\\1.pdf")
    );

【讨论】:

    【解决方案5】:

    使用java.nio.file.FilesS3Object 复制到本地文件。

    public File getFile(String fileName) throws Exception {
        if (StringUtils.isEmpty(fileName)) {
            throw new Exception("file name can not be empty");
        }
        S3Object s3Object = amazonS3.getObject("bucketname", fileName);
        if (s3Object == null) {
            throw new Exception("Object not found");
        }
        File file = new File("you file path");
        Files.copy(s3Object.getObjectContent(), file.toPath());
        return file;
    }
    

    【讨论】:

    • inputStream 是从哪里来的?我认为您的意思是 s3Object.close 或 s3Object.getObjectContent.close()。无论如何,nio 是一个很好的建议。
    【解决方案6】:

    依赖 AWS S3 存储桶

    implementation "commons-logging:commons-logging-api:1.1"
    implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.1000')
    implementation 'com.amazonaws:aws-android-sdk-core:2.6.0'
    implementation 'com.amazonaws:aws-android-sdk-cognito:2.2.0'
    implementation 'com.amazonaws:aws-android-sdk-s3:2.6.0'
    

    从 S3 存储桶下载对象并存储在本地存储中。

    try {
                    //Creating credentials
                    AWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
    
                    //Creating S3
                    AmazonS3Client s3Client = new AmazonS3Client(awsCredentials);
    
                    //Creating file path
                    File dir = new File(this.getExternalFilesDir("AWS"),"FolderName");
                    if(!dir.exists()){
                        dir.mkdir();
                    }
    
                    //Object Key
                    String bucketName = "*** Bucket Name ***";
                    String objKey = "*** Object Key ***";
                    
                    //Get File Name from Object key
                    String  name = objKey.substring(objKey.lastIndexOf('/') + 1);
    
                    //Storing file S3 object in file path
                    InputStream in = s3Client.getObject(new GetObjectRequest(bucketName, objKey)).getObjectContent();
                    Files.copy(in,Paths.get(dir.getAbsolutePath()+"/"+name));
                    in.close();
    
                } catch (Exception e) {
                    Log.e("TAG", "onCreate: " + e);
                }
    

    从 S3 存储桶中获取对象列表

    public void getListOfObject()
        {
            ListObjectsV2Result result ;
            AWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
            AmazonS3Client s3Client = new AmazonS3Client(awsCredentials);
            result = s3Client.listObjectsV2(AWS_BUCKET);
            for( S3ObjectSummary s3ObjectSummary : result.getObjectSummaries())
            {
                Log.e("TAG", "onCreate: "+s3ObjectSummary.getKey() );
            }
        }
    

    检查桶中是否存在任何对象

    public String isObjectAvailable(String object_key)
        {
    
            try {
                AWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
                AmazonS3 s3 = new AmazonS3Client(awsCredentials);
                String bucketName = AWS_BUCKET;
                S3Object object = s3.getObject(bucketName, object_key);
                Log.e("TAG", "isObjectAvailable: "+object.getKey()+","+object.getBucketName() );
            } catch (AmazonServiceException e) {
                String errorCode = e.getErrorCode();
                if (!errorCode.equals("NoSuchKey")) {
                   // throw e;
                    Log.e("TAG", "isObjectAvailable: "+e );
                }
    
                return "no such key";
            }
            return "null";
        }
    

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多