Flux de téléchargement de fichier sur S3 Node.js à l'aide formidable et (knox ou aws sdk)

Je suis en train de flux de télécharger un fichier transmis via un formulaire directement à un compartiment Amazon S3, à l'aide de aws sdk ou knox. La gestion des formulaires est fait avec formidable.

Ma question est: comment puis-je utiliser correctement formidable avec aws sdk (ou knox) à l'aide de chacune de ces bibliothèques dernières fonctionnalités de manipulation de flux?

Je suis conscient que ce sujet a déjà été posée ici en différentes saveurs, c'est à dire:

Cependant, je crois que les réponses sont un peu obsolètes et/ou hors sujet (c'est à dire. Le soutien de la SCRO, dont je ne souhaite pas utiliser pour l'instant pour des raisons différentes) et/ou, surtout, de ne pas faire référence à des fonctionnalités les plus récentes soit à partir d'aws sdk (voir: https://github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442) ou knox (notamment putStream() ou de ses readableStream.pipe(req) variante, les deux expliqué dans la doc).

Après des heures de galère, j'en suis venu à la conclusion que j'avais besoin d'un peu d'aide (disclaimer: je suis un newbie avec le cours d'eau).

Formulaire HTML:

<form action="/uploadPicture" method="post" enctype="multipart/form-data">
  <input name="picture" type="file" accept="image/*">
  <input type="submit">
</form>

Express bodyParser middleware est configuré de cette manière:

app.use(express.bodyParser({defer: true}))

POSTE de gestionnaire des demandes:

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
    )

Cependant, j'obtiens l'erreur suivante:

{ [RequestTimeout: Votre prise de connexion au serveur n'a pas été lu ou écrit dans le délai imparti. Les connexions inactives seront fermés.]

message: "Votre prise de connexion au serveur n'a pas été lu ou écrit dans le délai imparti. Les connexions inactives sera fermé.',
code: 'RequestTimeout',
nom: RequestTimeout',
statusCode: 400,
renouvelable: false }

Un knox version de handlePart() la fonction adaptée de cette façon aussi qui échoue lamentablement:

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
  )      

J'ai aussi une grosse res objet avec un 400 statusCode quelque part.

Région est configuré pour eu-west-1 dans les deux cas.

Remarques supplémentaires:

nœud 0.10.12

dernière formidable de mnp (1.0.14)

dernière aws sdk de mnp (1.3.1)

dernière knox de mnp (0.8.3)

InformationsquelleAutor jbmusso | 2013-06-26