2015-10-13 102 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