2013-05-14 20 views
12

Mam problemy z pobieraniem plików do pracy z NodeJS. Używam Dropzone.JS utworzyć formularz, który wysyła żądanie POST do/pliku przesłać tutaj:multipart Przesyłanie plików przy użyciu NodeJS

<form action="/file-upload" class="dropzone dragndrop" id="my-awesome-dropzone"></form> 

Wtedy muszę trasy w app.js:

app.post('/file-upload', routes.upload); 

Wtedy mój obsługi:

exports.upload = function(req, res){ 
    console.log(req.files); 
    res.send("OK"); 
} 

Jednak funkcja przesyłania tutaj nigdy nie jest wywoływana. Serwer najpierw zawiesza się z tym błędem:

events.js:69 
     throw arguments[1]; // Unhandled 'error' event 
        ^
Error: Invalid data 
    at WriteStream._write (fs.js:1616:31) 
    at onwrite (_stream_writable.js:265:14) 
    at WritableState.onwrite (_stream_writable.js:94:5) 
    at fs.js:1628:5 
    at Object.wrapper [as oncomplete] (fs.js:475:5) 
    at process._makeCallback (node.js:321:24) 

Więc nie jestem pewien, co powinienem zrobić, ponieważ wydaje się, że to nie moja wina. Śledziłem inne tutoriale i nie widziałem niczego złego. Również, kiedy sprawdzać mojej sieci pod chrome narzędzia dev, to pokazuje:

Request URL:http://localhost:3000/file-upload 
**Request Headers** 
Accept:application/json 
Cache-Control:no-cache 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryMmLSkbfQskfIcjfE 
Origin:http://localhost:3000 
Pragma:no-cache 
Referer:http://localhost:3000/ 
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 
X-File-Name:Screenshot from 2013-03-20 12:23:42.png 
X-Requested-With:XMLHttpRequest 
**Request Payload** 
------WebKitFormBoundaryMmLSkbfQskfIcjfE 
Content-Disposition: form-data; name="file"; filename="Screenshot from 2013-03-20 12:23:42.png" 
Content-Type: image/png 


------WebKitFormBoundaryMmLSkbfQskfIcjfE-- 
+0

Wydaje się, podobnie jak nie ma żadnych danych binarnych rzeczywiście przeniesiony. –

+0

jaka jest twoja wersja węzła? czy możesz podać plik (nazwę i lokalizację), z którego program obsługi wywołujesz z app.js i jak analizujesz dane formularza? 'req.files' wymaga expressjs – user568109

+0

handler znajduje się w model.js, gdzie są przechowywane wszystkie moje programy obsługi związane z modelem. Mam expressJS –

Odpowiedz

10

@ user568109 i @ nick-fishman są poprawne; powinieneś użyć do tego oprogramowania pośredniego bodyParser.

Poniżej znajduje się przykładowy kod podstawowego formularza przesyłania plików. (Uwaga: trzeba będzie stworzyć "aktualizacje" katalog do przechowywania plików.)

plikach upload.js:

var express = require("express"),                 
    app = express();                    

// tell express to use the bodyParser middleware             
// and set upload directory                  
app.use(express.bodyParser({ keepExtensions: true, uploadDir: "uploads" }));      
app.engine('jade', require('jade').__express);             

app.post("/upload", function (request, response) {            
    // request.files will contain the uploaded file(s),           
    // keyed by the input name (in this case, "file")            

    // show the uploaded file name                
    console.log("file name", request.files.file.name);           
    console.log("file path", request.files.file.path);           

    response.end("upload complete");                
});                        

// render file upload form                  
app.get("/", function (request, response) {              
    response.render("upload_form.jade");               
});                        

app.listen(3000); 

views/upload_form.jade:

doctype 5 
html 
    head 
     title Upload Form 
    body 
     h1 Upload File 
     form(method="POST", action="/upload", enctype="multipart/form-data") 
      input(type="file", name="file") 
      input(type="submit") 
+1

request zwraca tablicę plików, więc spróbuj. console.log ("files", request.files); Dzięki za wspaniałą odpowiedź. Pracował jak urok. –

+2

https://github.com/senchalabs/connect/wiki/Connect-3.0 express.bodyParser jest zdyskwalifikowany –

2

@ user568109 jest poprawna: trzeba ExpressJS i włączona bodyParser. Czy w swojej konfiguracji masz linię podobną do poniższej?

app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/my/files' })); 
2

Spróbuj użyć parsera busboy-body, aby pobrać parametry ciała żądania i pliki.

start.js 
var bodyParser = require('body-parser'); 
var busboyBodyParser = require('busboy-body-parser'); 


// parse application/x-www-form-urlencoded 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

// parse application/json 
app.use(bodyParser.json()); 


//parse multipart/form-data  
app.use(busboyBodyParser()); 



controllers/someController.js 
someAction: function(req,res){ 
    if(req.method == "POST"){ 
      res.end(JSON.stringify(req.body)+JSON.stringify(req.files)); 
    } 
} 
//{"text":"testx"}{"anexo":{"data":{"type":"Buffer","data":.... }}} 
//req.body = {"text":"testx"} 
//req.files = {"anexo":{"data":{"type":"Buffer","data":.... }}} 


views/someController/someAction.html 
<form method="post" id="multipart" enctype="multipart/form-data"> 
    <input type="text" id="text1" name="text" value="testx" /> 
    <input type="file" id="anexo" name="anexo" /> 
    <input type="submit" value="Enviar" /> 
</form> 

Aby utworzyć plik przesłany, trzeba działać, jeśli strumienia, na przykład:

/* file props 
{ 
    "data":{"type":"Buffer","data":.... }, 
    "fieldname":"anexo", 
    "originalname":"images (1).jpg", 
    "encoding":"7bit", 
    "mimetype":"image/jpeg", 
    "destination":"c:\\live\\sources\\uploads\\", 
    "filename":"eventclock_images(1)_1443706175833.jpg", 
    "path":"c:\\live\\sources\\uploads\\eventclock_images(1)_1443706175833.jpg", 
    "size":9986 
} 
*/ 

var fileStream = fs.createWriteStream(file.path); 
fileStream.write(file.data); 
fileStream.end(); 

fileStream.on('error', function (err) { 
    //console.log("error",err); 
}); 
fileStream.on('finish', function (res) { 
    //console.log("finish",res); 
});  
+0

Witamy w Stackoverflow, jeśli chcesz odpowiedzieć na pytanie, to powinieneś rozważyć przypadek pytającego. –

Powiązane problemy