2014-01-20 98 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) 
相關問題