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:
- Comment recevoir un fichier téléchargé à l'aide de node.js formidable de la bibliothèque et de l'enregistrer sur Amazon S3 en utilisant knox?
- le nœud de l'application de flux de téléchargement de fichiers directement à amazon s3
- Accéder au fichier raw flux à partir d'un nœud-formidable téléchargement de fichier (et de son très utile accepté de répondre à overiding forme.onpart ne())
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)
Vous devez vous connecter pour publier un commentaire.
Bien, selon le créateur de Formidable, streaming direct vers Amazon S3 est impossible :
En effet, forme.bytesExpected se réfère à la taille de l'ensemble de la forme, et non pas la taille du fichier unique.
Les données doivent donc frapper la mémoire ou le disque sur le serveur avant d'être téléchargés sur S3.
À l'aide d'AWS S3 multipartUpload (s3-téléchargement-stream comme module de travail) et le noeud-formidable de lisible flux, vous pouvez diriger le flux à télécharger comme cette:
Depuis ce post est vieux et je crois en streaming directement est maintenant pris en charge, j'ai passé beaucoup de temps à la lecture de la date de réponses sur ce sujet...
Si ça aide quelqu'un, j'ai été en mesure de diffuser à partir du client s3 directement, sans la nécessité d'installer des paquets:
https://gist.github.com/mattlockyer/532291b6194f6d9ca40cb82564db9d2a
Le serveur suppose
req
est un objet de flux de données, dans mon cas, un Fichier objet a été utilisé dans xhr(envoyer), qui permettra d'envoyer des données binaires dans les navigateurs modernes.Oui il rompt la convention, mais si vous regardez l'essentiel c'est beaucoup plus propre que tout autre chose, j'ai trouvé s'appuyant sur d'autres paquets.
+1 pour le pragmatisme et grâce à @SalehenRahman pour son aide.
Essayez d'ajouter le 'ContentType' pour le Télécharger params (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property)