2015-06-10 7 views
15

Ich lade eine Datei mit dem Node SDK zu Amazon S3 hoch.Knoten JS AWS S3-Datei-Upload. So erhalten Sie die öffentliche URL Antwort

Die Datei-Uploads funktionieren gut, aber ich möchte die öffentliche URL der Datei an den Client zurücksenden.

Im Moment ist die Antwort, die ich erhalten ist:

Successfully uploaded data { ETag: '"957cd1a335adf5b4000a5101ec1f52bf"' } 

Hier ist mein Code. Ich verwende einen Node-Express-Server und Multer, um Uploads zu verarbeiten.

app.use(multer({ // https://github.com/expressjs/multer 
     dest: './public/uploads/', 
     limits : { fileSize:100000 }, 
     rename: function (fieldname, filename) { 
     var time = new Date().getTime(); 
     return filename.replace(/\W+/g, '-').toLowerCase() + time; 
     }, 
     onFileUploadData: function (file, data, req, res) { 
     // file : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer } 
     var params = { 
      Bucket: creds.awsBucket, 
      Key: file.name, 
      Body: data, 
      ACL: 'public-read' 
     }; 

     var s3 = new aws.S3() 
     s3.putObject(params, function (perr, pres) { 
      if (perr) { 
      console.log("Error uploading data: ", perr); 
      } else { 
      console.log("Successfully uploaded data", pres); 
      } 
     }); 
     } 
    })); 

    app.post('/upload-image', function(req, res){ 
     if(req.files.file === undefined){ 
      res.send("error, no file chosen"); 
     } 
    }); 
+0

, wie Sie dies funktioniert, habe ich bekommen ‚Fehler beim Initialisieren der Middleware Typeerror: app.use() erfordert Middleware-Funktionen‘ Nachricht – someUser

Antwort

16

Verwenden upload statt putObject. Es wird wieder öffentliche URL in Lage Schlüssel

+3

Schräge. 'putObject (...). promise()' funktioniert gut, aber 'upload (...). promise()' ist nicht definiert. Warum haben sie das gemacht? – Richard

+1

@Richard tut 'putObject (...). Promise()' gibt die öffentliche URL in einem Ortsschlüssel zurück, da ich sie selbst nicht finden kann. Hier einige Informationen aus Juli 2016: Versprechen werden derzeit nur für Vorgänge unterstützt, die ein Request-Objekt zurückgeben. Da es sich bei s3.upload um eine benutzerdefinierte Funktion handelt, die eine Instanz von ManagedUpload anstelle von Request zurückgibt, werden Versprechen für diesen Vorgang derzeit nicht unterstützt [Referenz] (https://github.com/aws/aws-sdk-js/issues/1076# Problemkommentar-235941953) – Marklar

Verwandte Themen