2015-10-13 99 views
0

我想將字符串追加到存儲在S3中的文本文件的末尾。 目前我只是將文件的內容讀入字符串,追加我的新文本並將文件重新保存回S3。 有沒有更好的方法來做到這一點。我想當文件是>>> 10MB然後閱讀整個文件不會是一個好主意,所以我應該如何正確地做到這一點?更新亞馬遜S3存儲桶中的文件

當前代碼 [代碼]

private void saveNoteToFile(String p_note) throws IOException, ServletException  
{ 
    String str_infoFileName = "myfile.json"; 

    String existingNotes = s3Helper.getfileContentFromS3(str_infoFileName ); 
    existingNotes += p_note; 
    writeStringToS3(str_infoFileName , existingNotes);   
} 

public void writeStringToS3(String p_fileName, String p_data) throws IOException 
{ 
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(p_data.getBytes()); 

    try { 
     streamFileToS3bucket( p_fileName, byteArrayInputStream, p_data.getBytes().length); 
    } 
    catch (AmazonServiceException e) 
    { 
     e.printStackTrace(); 
    } catch (AmazonClientException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public void streamFileToS3bucket(String p_fileName, InputStream input, long size) 
{ 
    //Create sub folders if there is any in the file name. 
    p_fileName = p_fileName.replace("\\", "/"); 
    if(p_fileName.charAt(0) == '/') 
    { 
     p_fileName = p_fileName.substring(1, p_fileName.length()); 
    } 
    String folder = getFolderName(p_fileName); 
    if(folder.length() > 0) 
    { 
     if(!doesFolderExist(folder)) 
     { 
      createFolder(folder); 
     } 
    } 
    ObjectMetadata metadata = new ObjectMetadata(); 
    metadata.setContentLength(size); 
    AccessControlList acl = new AccessControlList(); 
    acl.grantPermission(GroupGrantee.AllUsers, Permission.Read); 

    s3Client.putObject(new PutObjectRequest(bucket, p_fileName , input,metadata).withAccessControlList(acl)); 
} 

[/代碼]

回答

6

這是不可能以追加到上AWS S3現有文件。如果您上傳的對象時,它會創建一個新的版本,如果它已經存在:

如果您上傳的是已經存在於 桶的關鍵名稱的對象,亞馬遜S3創建對象的另一個版本,而不是 更換現有的對象

來源:http://docs.aws.amazon.com/AmazonS3/latest/UG/ObjectOperations.html

的對象是不可變的。

它在這些AWS論壇主題也提到:

https://forums.aws.amazon.com/message.jspa?messageID=179375 https://forums.aws.amazon.com/message.jspa?messageID=540395

+0

您可以通過使用Amazon LAMBDA來解決這個問題。然而。如果您只上傳更改,則可以觸發Lambda代碼,這可能會將更改附加到目標對象。仍然需要按照上述方式製作副本,但是重新上傳對象(取決於其大小)會更有效率。 – sthede

+0

這仍然需要從Lambda @sthede中下載並重新上傳對象。如答案所述,S3中的對象是不可變的。它們只能被替換,而不能修改。 –

+0

似乎S3並不是這個用例的解決方案。文件預計會變得非常大。回到繪圖板 – MayoMan