Rohr stream zu s3.Upload (hochladen)
Ich bin derzeit die Nutzung von node.js plugin namens s3-upload-stream zum streamen von sehr großen Dateien auf Amazon S3. Es nutzt multipart API und zum größten Teil, es funktioniert sehr gut.
Jedoch, dieses Modul zeigt sein Alter, und ich habe auch schon einige änderungen vornehmen, um es (hat der Autor missbilligt, Sie auch). Heute lief ich in ein weiteres Problem mit Amazon, und ich würde wirklich gerne den Autor die Empfehlung und beginnen mit dem offiziellen aws-sdk zu erreichen, meine uploads.
ABER.
Dem offiziellen SDK scheint das nicht zu unterstützen Rohrleitungen zu s3.upload()
. Die Natur des s3.upload ist, dass Sie zu Durchlaufen haben, der lesbar-stream als argument für den S3-Konstruktor.
Ich habe ungefähr 120+ user-code-Modulen, die verschiedene Datei-Verarbeitung, und Sie sind gebunden an das endgültige Ziel Ihrer Leistung. Der Motor gibt Ihnen eine pipeable writeable stream-Ausgabe, und Sie Rohr dazu. Ich kann nicht mit der hand ein AWS.S3
Objekt und bitten Sie Sie, zu rufen upload()
auf, ohne hinzufügen von code, um alle Module. Der Grund, warum ich verwendet s3-upload-stream
war, weil es unterstützt Rohrleitungen.
Ist es eine Möglichkeit zu aws-sdk s3.upload()
etwas, was ich kann-Rohr den stream an?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wickeln Sie die S3
upload()
Funktion mit der node.jsstream.PassThrough()
stream.Hier ein Beispiel:
In der akzeptierten Antwort, die Funktion endet, bevor der upload abgeschlossen ist, und daher, es ist falsch. Der code unten Rohre ordnungsgemäß von einem lesbaren stream.
Upload-Referenz
Können Sie auch einen Schritt weiter gehen und Ausgang Fortschritte info mit
ManagedUpload
als solche:ManagedUpload Referenz
Eine Liste der verfügbaren Ereignisse
TypeError: dest.on is not a function
, keine Ahnung warum?dest.on
? Können Sie ein Beispiel zeigen? @FireBrandEin bisschen spät die Antwort, es könnte jemand anderes helfen hoffentlich. Kannst du beide writeable stream und das Versprechen, so können Sie den response-Daten, wenn upload abgeschlossen ist.
Und Sie können verwenden Sie die Funktion wie folgt:
Art Skript-Lösung:
Dieses Beispiel verwendet:
Und async-Funktion:
Rufen Sie diese Methode irgendwo wie:
Für diejenigen, die sich beklagt, dass die, wenn Sie mit der s3 api upload-Funktion und eine null byte Datei endet auf s3 (@Radar155 und @gabo) - ich hatte auch dieses problem.
Erstellen Sie eine zweite PassThrough-stream und nur Rohr alle Daten von der ersten auf die zweite und übergeben den Verweis auf das zweite s3. Sie können dies tun, in ein paar verschiedene Möglichkeiten, eventuell eine schmutzige Art und Weise zu hören ist für die "data" - Ereignis auf dem ersten stream und dann schreiben, dass die gleichen Daten auf dem zweiten stream - die in ähnlicher Weise für die "Ende" - Ereignis - rufen Sie einfach die end-Funktion auf dem zweiten stream. Ich habe keine Ahnung, ob das ein bug in der aws-api, ist die version der Knoten oder eine andere Frage - aber es funktionierte, um das Problem für mich.
Hier ist, wie es Aussehen könnte:
Wenn es hilft jemand ich war in der Lage, stream vom client zum s3 erfolgreich:
https://gist.github.com/mattlockyer/532291b6194f6d9ca40cb82564db9d2a
Der serverseitige code wird davon ausgegangen
req
ist ein stream-Objekt, in meinem Fall war es geschickt von der client mit Datei-info einstellen, die in der Header.Ja, es bricht Konvention, aber wenn man sich auf das wesentliche, es ist viel sauberer als alles, was ich über multer, Aushilfe etc...
+1 für Pragmatismus und Dank @SalehenRahman für seine Hilfe.
Ich bin mit KnexJS und hatte ein problem mit Ihren streaming-API. Ich endlich fixiert es, hoffentlich im folgenden wird jemand helfen.
Keiner der Antworten, die für mich gearbeitet, weil ich wollte:
s3.upload()
s3.upload()
in einem anderen streamAkzeptiert die Antwort nicht letzteres tun. Die anderen verlassen sich auf die Versprechen api, das ist mühsam zu arbeiten, wenn die Arbeit mit stream-pipes.
Dies ist meine Modifikation der akzeptierten Antwort.
JS:
Wenn Sie wissen, die Größe des Streams, die Sie verwenden können minio-js hochladen der stream so: