2017-03-23 2 views
0

Ich habe versucht, Image-Datei von Client-Seite zu meinem AWS S3 Storage Server mit Multer mit der Unterstützung von multer-s3. Ich erhalte jedoch immer undefinierte Ergebnisse für meinen req.file-Aufruf. Ich habe gegoogelt und alle möglichen Ursachen für mein Problem geprüft und bisher kein Glück. Hoffe jemand kann mir hier helfen. Danke im Voraus.req.file immer undefiniert mit multer in meinem Node Express-Anwendung

Client-Seite HTML-Code:

<form method="post" enctype="multipart/form-data" action="/create"> 
    <input type="text" name="name" /> 
    <input type="text" name="topic" /> 
    <input type="file" name="image" /> 
    <input type="submit" value="Upload" /> 
</form> 

Server-Side-Code:

var express = require('express'); 
var http = require('http'); 
var app = express(); 
var methodOverride = require('method-override'); 
var bodyParser = require('body-parser'); 
var multer = require('multer'); 
var multerS3 = require('multer-s3'); 
var AWS = require('aws-sdk'); 

app.use(methodOverride()); 
app.use(bodyParser.urlencoded({ extended: true })); 

//Create S3 client 
var s3 = new AWS.S3(); 

//this code is copy directly from multer-s3 since I don't care about my file name shown on S3 for now 
var upload = multer({ 
    storage: multerS3({ 
    s3: s3, 
    bucket: mybuckname, 
    metadata: function (req, file, cb) { 
     cb(null, {fieldName: file.fieldname}); 
    }, 
    key: function (req, file, cb) { 
     cb(null, Date.now().toString()) 
    } 
    }) 
}); 

app.post('/create', upload.single('image'), function(req, res) { 
    var nameField = req.body.name, 
     topicField = req.body.topic; 
    console.log("File: ", req.file); 

    console.log("Name: ", nameField); 
    console.log("Topic: ", topicField); 
    res.sendStatus(200); 

    res.end(); 
}); 

Ich habe versucht, die folgenden:

  1. entfernt 'body-Parser' und verwenden 'multer' nur, dann noch schlechteres Ergebnis (sowohl req.body als auch req.file sind undefiniert). Mit body-parser kann ich zumindest garantieren, dass req.body funktioniert
  2. Um die Ursache zu vereinfachen, entfernte ich alle meine Textfeldeingaben von der Clientseite und ließ nur die Dateiuploadoption, um sicherzustellen, dass ich nur noch Dateidaten übertrage return undefined für req.file (multer funktioniert überhaupt nicht)
  3. Ich lese auch über die Möglichkeit, dass "req.body möglicherweise noch nicht vollständig ausgefüllt worden ist. Es hängt von der Reihenfolge ab, dass der Client Felder und Dateien überträgt zum Server. " In meinem Fall bekomme ich die Datei nicht, also spielt es für mich keine Rolle.
  4. Verwenden Multer nur ohne Multer-s3, und versuchte upload.array anstelle von upload.single, immer noch kein Glück (multer-s3 ist auf Multer gebaut, so dass ich glaube nicht, dass es etwas mit meinem aktuellen zu tun hat Problem, aber nur um es zu versuchen)
  5. überspringen AWS S3 und speichern sie in lokalen Pfad, noch undefiniertes Ergebnis
+0

Es scheint, dass es hier keinen Vorschlag gibt. Ich denke, ich muss meinen Code auf "Busboy" umstellen und hoffe, dass es funktioniert. Meine einzige Angst ist, dass das gleiche Problem auftreten wird, wenn man bedenkt, dass "Multer" auf "Busboy" aufgebaut ist. Ich kann sehen, dass viele Leute dieses Problem gelöst haben, und ich überprüfe jede Lösung, um sicherzustellen, dass ich das richtig mache. Aber ich denke, niemand hat meine Situation getroffen. – RogerMW

Antwort

0

nach langem Kampf Umschalten zwischen multer und busboy und nichts funktioniert. Plötzlich bemerkte ich, dass meine Form tatsächlich ein Polymer-Element 'ist = "Eisen-Form"' verwendet, das mein Fehler nicht in meinem ursprünglichen Post wie unten gezeigt eingegeben hat. Nachdem ich es entfernt habe, arbeitet mein Datei-Upload auf Multer - ich bin mir sicher, dass es auch auf Busboy funktionieren wird.

<form is="iron-form" method="post" enctype="multipart/form-data" action="/create"> 

Polymer-Elemente verursachen in der Vergangenheit immer Probleme für mich. Aber nimm mich nicht falsch, es ist ein großartiges Projekt mit vielen großartigen Dingen, die verfügbar sind, um deine Seite zu gestalten. Aber Sie müssen wirklich verstehen, wie Sie diese Elemente nutzen, um den Vorteil daraus zu ziehen. In meinem Fall lerne ich aus meiner Lektion und hoffe, es mit Ihnen zu teilen.