Die Aktualisierung einer Datei in einem Amazon S3-bucket
Ich bin versucht, eine Zeichenfolge angefügt an das Ende einer text-Datei gespeichert in S3.
Momentan habe ich nur Lesen Sie den Inhalt der Datei in eine Zeichenfolge, hängen meine neuen text ein und speichern Sie die Datei wieder auf S3.
Gibt es einen besseren Weg, dies zu tun. Ich bin thinkinig, wenn die Datei >>> 10MB dann liest die gesamte Datei würde nicht eine gute Idee sein, wie also sollte ich alles richtig mache?
Aktuellen code
[code]
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));
}
[/code]
InformationsquelleAutor MayoMan | 2015-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich, an eine vorhandene Datei Anhängen, die auf AWS S3. Beim hochladen eines Objekts erstellt es eine neue version, falls es bereits vorhanden ist:
Quelle: http://docs.aws.amazon.com/AmazonS3/latest/UG/ObjectOperations.html
Objekte sind unveränderlich.
Es ist auch erwähnt in diesen AWS-Forum-threads:
https://forums.aws.amazon.com/message.jspa?messageID=179375
https://forums.aws.amazon.com/message.jspa?messageID=540395
Dies würde erfordern immer noch einen download-und re-upload des Objekts von innerhalb der Lambda @sthede. Als Antwort erwähnt, werden Objekte in S3 sind unveränderlich. Sie können nur ersetzt werden, nicht verändert.
Scheint dann, dass die S3 wird nicht die Lösung für diesen Anwendungsfall. Die Datei wird voraussichtlich sehr groß werden. Zurück ans Reißbrett
Obwohl es technisch wahr ist, dass die Lambda müssten, um den download und laden Sie dann das Objekt, und Objekte sind zwar unveränderlich, die Bedienung, weil es getan wird, im wesentlichen 'auf dem server' von der Lambda wäre fast instant. Ähnlich zu tun, die gefälschte "umbenennen" auf S3, es ist kein umbenennen, nur eine Kopie mit einem follow-up löschen (wenn der name anders ist), die Bedienung ist fast instant, obwohl es eine vollständige Kopie des Objekts gemacht wird, nur um im wesentlichen den Dateinamen ändern. Tun die gleiche operation aus der Ferne wäre inakzeptabel.
Ich denke, dass dies möglicherweise etwas veraltet jetzt. Es scheint, dass für eine einzelne Eimer können Sie deaktivieren, versioning, was bedeutet, Sie können opt-out von diesem Verhalten. docs.aws.amazon.com/AmazonS3/latest/user-guide/...
InformationsquelleAutor Volkan Paksoy