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:

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)

InformationsquelleAutor jbmusso | 2013-06-26
Schreibe einen Kommentar