2014-01-20 1195 views
0

我试图使用适用于Java的AWS SDK从S3下载文件,并将特定文件存储在本地PC中的目录中。如何将下载的文件对象从S3存储到本地目录

我写的下载对象的代码是:

public void download(String key) { 
S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key)); 
} 

但我真正想要做的是通过本地路径作为参数,而不是关键和下载的文件OBJ存储在特定的目录说/ tmp/AWSStorage /在我的Linux机器。

你能提出一个建议吗?

+1

,但是从文档似乎像'obj.getDataInputStream()'将返回流这你可以用'IOUtils.copy(是,新的FileOutputStream(文件))'复制到你的文件;'。 –

回答

-1

在行S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key)); bucketname是S3BucketName密钥为对象名称,它不是一个本地文件路径。 关键 - 是常见的前缀组合/对象名

也就是说,如果你的文件被保存在桶的根则仅对象的名称将是关键,即myfile.txt的 但如果你的文件被保存像myfolder1/myfolder2/myfile.txt然后 myfolder1/myfolder是您的通用前缀,myfile.txt是objectname。

S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,"myfolder1/myfolder2/myfile.txt")); 
+0

这里的问题是在哪里指定本地路径,而不是S3上的路径 – hadooper

0

您可以使用obj.getDataInputStream()来获取文件。然后用org.apache.commons.io.IOUtilscopy方法复制。

S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key)); 
File file=new File("/tmp/AWSStorage/"+key); 

// if the directory does not exist, create it 
if (!file.getParentFile().exists()) { 
    file.getParentFile().mkdirs(); 
} 

然后你可以使用下面的任何一种。

try { 
    IOUtils.copy(obj.getDataInputStream(), new FileOutputStream(file)); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

OR

BufferedReader reader=null; 
BufferedWriter out=null; 
String data = null; 
try { 
    reader = new BufferedReader(new InputStreamReader(fileObj.getDataInputStream())); 
    out = new BufferedWriter (new FileWriter(file)); 
    while ((data = reader.readLine()) != null) { 
     out.write(data); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
finally { 
    reader.close(); 
    out.close(); 
} 
+1

我发现s3Client的这个API:s3Client.getObject(new GetObjectRequest(bucketName,key),file)获取对象元数据并将其存储在本地位置的文件中。 s3Client中是否有类似的方法将完整的文件存储在位置? –

+0

此方法是否仅存储它在文件或对象内容中返回的对象元数据?它真的令人困惑...请帮助 –

3

我用:

s3Client.getObject(new GetObjectRequest(bucket,key),file); 

它工作得很好。

1

使用Java> = 1.6,您可以直接复制下载到本地目录的文件,而不会有任何文件损坏的问题。检查代码:

S3Object fetchFile = s3.getObject(new GetObjectRequest(bucketName, fileName)); 
final BufferedInputStream i = new BufferedInputStream(fetchFile.getObjectContent()); 
InputStream objectData = fetchFile.getObjectContent(); 
Files.copy(objectData, new File("D:\\" + fileName).toPath()); //location to local path 
objectData.close(); 

使用Java 1.6及更高版本,您可以直接在Files.copy函数中指定路径。

1

有一个API直接下载文件,我还没有使用这个API本地路径

ObjectMetadata getObject(GetObjectRequest getObjectRequest, 
        File destinationFile) 
相关问题