Comment télécharger un fichier à partir du navigateur vers Amazon S3 avec node.js, Express, et knox? [fermé]
J'essaie de trouver un exemple de code qui utilise nœud.js, Express, et knox.
Les documents pour Knox ne donnent que des exemples clairs de la façon de télécharger un fichier déjà stocké dans le système de fichiers. https://github.com/learnboost/knox#readme
En outre, il y a un certain nombre de tutoriels simples (même dans Express lui-même) sur la façon de télécharger des fichiers directement à express et enregistrer dans le système de fichiers.
Ce que j'ai du mal à trouver est un exemple qui vous permet de télécharger un client téléchargez sur un serveur de nœud et faites diffuser les données directement sur S3 plutôt que de les stocker dans le système de fichiers local en premier.
Quelqu'un peut-il me diriger vers un essentiel ou un autre exemple qui contient ce genre d'information?
6 réponses
Toutes les réponses précédentes impliquent que le téléchargement passe par votre nœud.serveur js qui est inefficace et inutile. Votre serveur de nœud n'a pas à gérer la bande passante ou le traitement des fichiers téléchargés, car Amazon S3 permet les téléchargements directement depuis le navigateur .
Jetez un oeil à ce billet de blog: http://blog.tcs.de/post-file-to-s3-using-node/
Je n'ai pas essayé le code répertorié ici, mais après l'avoir regardé, il semble solide et je tentera une mise en œuvre de celui-ci bientôt ad mettra à jour cette réponse avec mes conclusions.
Voici un exemple de streaming directement sur s3 sans jamais toucher votre disque dur, en utilisant multiparty et knox :
var http = require('http')
, util = require('util')
, multiparty = require('multiparty')
, knox = require('knox')
, Batch = require('batch')
, PORT = process.env.PORT || 27372
var s3Client = knox.createClient({
secure: false,
key: process.env.S3_KEY,
secret: process.env.S3_SECRET,
bucket: process.env.S3_BUCKET,
});
var Writable = require('readable-stream').Writable;
util.inherits(ByteCounter, Writable);
function ByteCounter(options) {
Writable.call(this, options);
this.bytes = 0;
}
ByteCounter.prototype._write = function(chunk, encoding, cb) {
this.bytes += chunk.length;
cb();
};
var server = http.createServer(function(req, res) {
if (req.url === '/') {
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="path"><br>'+
'<input type="file" name="upload"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
} else if (req.url === '/upload') {
var headers = {
'x-amz-acl': 'public-read',
};
var form = new multiparty.Form();
var batch = new Batch();
batch.push(function(cb) {
form.on('field', function(name, value) {
if (name === 'path') {
var destPath = value;
if (destPath[0] !== '/') destPath = '/' + destPath;
cb(null, destPath);
}
});
});
batch.push(function(cb) {
form.on('part', function(part) {
if (! part.filename) return;
cb(null, part);
});
});
batch.end(function(err, results) {
if (err) throw err;
form.removeListener('close', onEnd);
var destPath = results[0]
, part = results[1];
var counter = new ByteCounter();
part.pipe(counter); // need this until knox upgrades to streams2
headers['Content-Length'] = part.byteCount;
s3Client.putStream(part, destPath, headers, function(err, s3Response) {
if (err) throw err;
res.statusCode = s3Response.statusCode;
s3Response.pipe(res);
console.log("https://s3.amazonaws.com/" + process.env.S3_BUCKET + destPath);
});
part.on('end', function() {
console.log("part end");
console.log("size", counter.bytes);
});
});
form.on('close', onEnd);
form.parse(req);
} else {
res.writeHead(404, {'content-type': 'text/plain'});
res.end('404');
}
function onEnd() {
throw new Error("no uploaded file");
}
});
server.listen(PORT, function() {
console.info('listening on http://0.0.0.0:'+PORT+'/');
});
Exemple tiré de https://github.com/superjoe30/node-multiparty/blob/master/examples/s3.js
Le code node / express ne fonctionne pas avec nodejs v0.4. 7
Voici le code mis à jour pour nodejs v0.4. 7
app.post('/upload', function (req, res) {
// connect-form additions
req.form.complete(function (err, fields, files) {
// here lies your uploaded file:
var path = files['upload-file']['path'];
// do knox stuff here
});
});
* mise à jour *
À partir de la mi-2009, amazon prend en charge CORS et le téléchargement via votre nœud.le serveur js n'est plus nécessaire. vous pouvez directement télécharger le fichier sur S3.
Avec l'aide du module "connect-form", vous pouvez simplement télécharger le fichier sur votre serveur (via un formulaire multipart normal), puis Gérer les fichiers S3 par la suite ...
<form action="/upload" method="POST" id="addContentForm" enctype="multipart/form-data">
<p><label for="media">File<br/><input type="file" name="media" /></label></p>
<p><button type="submit">upload</button></p>
</form>
Code noeud / express:
app.post('/upload', function (req, res) {
// connect-form additions
req.form.complete(function (err, fields, files) {
// here lies your uploaded file:
var path = files['media']['path'];
// do knox stuff here
});
});
, Vous devez ajouter la ligne suivante à la configuration de l'application:
app.configure(function(){
// rest of the config stuff ...
app.use(form({ keepExtensions: true }));
// ...
});
La bibliothèque connect-stream-s3 peut télécharger tous vos fichiers de formulaires vers S3 dans le cadre d'un middleware afin que vous n'ayez pas à faire de logique vous-même. Il a besoin d'exprimer.bodyParser() pour que cela fonctionne en ce moment, mais je travaille sur une version qui diffusera des fichiers directement sur Amazon S3 avant d'être écrit sur le disque:
Faites-moi savoir comment vous vous en sortez. J'espère que c'est beaucoup moins compliqué que de le faire vous même une fois vous êtes dans votre gestionnaire de page. :)
J'ai fait cela pour télécharger directement à partir du plugin de téléchargement de fichier Jquery vers S3 avec le fichier étant public - il devrait vous diriger dans la bonne direction.