Stream Upload-Datei auf S3 Node.js mit gewaltigen und (knox oder aws-sdk)
Ich versuche zu streamen, hochladen einer Datei übermittelt über ein Formular direkt zu einem Amazon S3-bucket, mit aws-sdk oder knox. Form Behandlung erfolgt mit gewaltige.
Meine Frage ist: wie gehe ich richtig mit gewaltigen mit aws-sdk (oder knox) mit jeder dieser Bibliotheken, die neuesten Funktionen für die Handhabung von streams?
Ich bin mir bewusst, dass dieses Thema schon gefragt wurde hier in verschiedenen Geschmacksrichtungen, dh:
- So erhalten Sie eine hochgeladene Datei mittels node.js gewaltige Bibliothek und speichern Sie es auf Amazon S3 mit knox?
- Knoten-Applikation-stream-Datei-upload direkt zu amazon s3
- Der Zugriff auf die raw-Datei-stream von einer Knoten-gewaltige-Datei hochladen (und es ist sehr nützlich, akzeptierte Antwort auf overiding form.onPart())
Aber ich glaube die Antworten sind ein bisschen veraltet und/oder off-topic (ie. Mit CORS-support, die ich nicht benutzen möchten für jetzt aus verschiedenen Gründen), und/oder, was am wichtigsten ist, stellen Sie keinen Bezug zu den neuesten Funktionen, die entweder aus den aws-sdk (siehe: https://github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442) oder knox (insbesondere putStream() oder seine readableStream.Rohr(req) Variante, beide erklärten in der doc).
Nach Stunden zu kämpfen, ich kam zu dem Schluss, dass ich brauchte etwas Hilfe (disclaimer: ich bin ziemlich ein Neuling mit streams).
HTML-Formular:
<form action="/uploadPicture" method="post" enctype="multipart/form-data">
<input name="picture" type="file" accept="image/*">
<input type="submit">
</form>
Express bodyParser middleware auf diese Weise konfiguriert ist:
app.use(express.bodyParser({defer: true}))
POST-request-handler:
uploadPicture = (req, res, next) ->
form = new formidable.IncomingForm()
form.parse(req)
form.onPart = (part) ->
if not part.filename
# Let formidable handle all non-file parts (fields)
form.handlePart(part)
else
handlePart(part, form.bytesExpected)
handlePart = (part, fileSize) ->
# aws-sdk version
params =
Bucket: "mybucket"
Key: part.filename
ContentLength: fileSize
Body: part # passing stream object as body parameter
awsS3client.putObject(params, (err, data) ->
if err
console.log err
else
console.log data
)
Allerdings bin ich mir immer die folgende Fehlermeldung:
{ [RequestTimeout: Ihre socket-Verbindung zum server konnte nicht gelesen oder geschrieben werden, um innerhalb des Zeitlimits. Inaktive verbindungen geschlossen werden.]
Meldung: "Ihre socket-Verbindung zum server konnte nicht gelesen oder geschrieben werden, um innerhalb des Zeitlimits. Inaktive verbindungen werden geschlossen.',
code: 'RequestTimeout',
name: 'RequestTimeout',
statusCode: 400,
wiederholbarer: false }
Einen knox-version von Griffteil () - Funktion, zugeschnitten auf diese Weise auch kläglich versagt:
handlePart = (part, fileSize) ->
headers =
"Content-Length": fileSize
"Content-Type": part.mime
knoxS3client.putStream(part, part.filename, headers, (err, res) ->
if err
console.log err
else
console.log res
)
Ich auch einen großen res-Objekt mit einem 400-statusCode irgendwo.
Region konfiguriert ist, um eu-west-1 in beiden Fällen.
Zusätzliche Hinweise:
Knoten 0.10.12
neuesten gewaltig von npm (1.0.14)
neuesten aws-sdk von npm (1.3.1)
neuesten knox von npm (0.8.3)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, nach dem Schöpfer der Gewaltigen, direktes streaming zu Amazon S3 ist unmöglich :
Tatsächlich form.bytesExpected bezieht sich auf die Größe der ganzen form und nicht die Größe der einzelnen Datei.
Die Daten müssen daher entweder auf den Speicher oder die Festplatte auf dem server den ersten, bevor Sie in S3 hochgeladen.
Mithilfe von AWS S3 multipartUpload (s3-upload-stream als Arbeits-Modul) und Knoten-formidable ist lesbar stream, können Sie die pipe den stream hochladen, wie diese:
Da, dieser Beitrag ist so alt und ich glaube streamen wird nun unterstützt, ich verbrachte eine Menge Zeit mit dem Lesen von Datum Antworten zu diesem Thema...
Wenn es hilft jemand ich war in der Lage, stream vom client zum s3 direkt, ohne die Notwendigkeit für die Installation von Paketen:
https://gist.github.com/mattlockyer/532291b6194f6d9ca40cb82564db9d2a
Der server übernimmt
req
ist ein stream-Objekt, in meinem Fall ein File-Objekt, das verwendet wurde, in xhr(senden), das senden von binären Daten in modernen Browsern.Ja, es bricht Konvention, aber wenn man sich auf das wesentliche, es ist viel sauberer als alles, was ich gefunden unter Berufung auf andere Pakete.
+1 für Pragmatismus und Dank @SalehenRahman für seine Hilfe.
Versuchen 'ContentType', um den Upload-params (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property)