2012-04-12 8 views
7

अपलोड हो फ़ाइलें उन्हें अपलोड करने एकाधिक फ़ाइलों के साथ सामान न करें: (एकाधिक = "एकाधिक" एक HTML5 विशेषता है कि उपयोगकर्ताओं को अपलोड करने के लिए एकाधिक फ़ाइलों का चयन करने के लिए)जब साथ नोड दुर्जेय एक्सप्रेस पर इस</p> <pre><code>app.post('/upload', function(req, res) { // do something with req.files }); </code></pre> <p>फ़ाइलों अब</p> <p>रूप में सहेजे जाते हैं के रूप में सरल है नोड दुर्जेय का उपयोग कर एक्सप्रेस के साथ

<form method="post" enctype="multipart/form-data" action="upload"> 
    <input type="text" name="title"/> 
    <input type="file" name="upload" multiple="multiple"/> 
    <input type="submit" value="upload" id="s3form_submit"/> 
</form> 

तो मैं अपलोड कोड में यह पंक्ति जोड़ की अनुमति देता है

+०१२३५१६४१०६
console.log(req.files.upload.path); 

एक फ़ाइल अपलोड करते समय, पथ कंसोल में दिखाई देता है। लेकिन जब मैं एक से अधिक फाइल अपलोड करता हूं तो यह कंसोल में अपरिभाषित कहता है। मैं प्रत्येक फ़ाइल के लिए लॉग सामान कैसे प्राप्त करूं? लूप के लिए उपयोग करना? https://github.com/felixge/node-formidable/blob/master/example/upload.js (मैं एक्सप्रेस में इस कोड का उपयोग करने की कोशिश की, काम नहीं किया) यह मैं वास्तव में क्या चाहता है, लेकिन मैं कैसे एक में ऐसा करते हैं:

GitHub पर नोड दुर्जेय उदाहरण जब आप कई अपलोड हर फ़ाइल लॉग एक्सप्रेस ऐप?

उत्तर

8

यह नीचे दिए गए लाइन को app.configure फ़ंक्शन के नीचे ले जाकर काम करता है। एक्सप्रेस यहाँ मिडलवेयर के बारे में के बारे में पढ़ें आदेश के महत्व: http://expressjs.com/guide.html#middleware

app.use(express.bodyParser({ uploadDir:__dirname + '/public/uploads' })); 

और यह हैंडलर का उपयोग करके:

app.post('/upload', function(req, res){ 
    var form = new formidable.IncomingForm(), 
    files = [], 
    fields = []; 
    form.on('field', function(field, value) { 
     fields.push([field, value]); 
    }) 
    form.on('file', function(field, file) { 
     console.log(file.name); 
     files.push([field, file]); 
    }) 
    form.on('end', function() { 
     console.log('done'); 
     res.redirect('/forms'); 
    }); 
    form.parse(req); 
}); 

धन्यवाद रयान!

1

तो req.files एक सरणी हो सकती है। हैंडलर में console.log(req.files) करने का प्रयास करें और देखें कि यह कैसा दिखता है ... लेकिन मुझे लगता है कि आप इसे अपने उदाहरण में ऐसा करने से बेहतर हैं। आप इसे शीर्ष पर ../test/common को हटाकर और स्थैतिक मानों में स्थिरांक को बदलकर काम करने के लिए प्राप्त कर सकते हैं (उदाहरण के लिए TEST_TMP__dirname + '/uploads' का उपयोग करें)।

हैंडलर:

var form = new formidable.IncomingForm(), 
    files = [], 
    fields = []; 

form.uploadDir = __dirname + '/uploads'; 

form 
    .on('field', function(field, value) { 
    console.log(field, value); 
    fields.push([field, value]); 
    }) 
    .on('file', function(field, file) { 
    console.log(field, file); 
    files.push([field, file]); 
    }) 
    .on('end', function() { 
    console.log('-> upload done'); 
    res.writeHead(200, {'content-type': 'text/plain'}); 
    res.write('received fields:\n\n '+util.inspect(fields)); 
    res.write('\n\n'); 
    res.end('received files:\n\n '+util.inspect(files)); 
    }); 
form.parse(req); 

फ़ाइलों अब __dirname + '/uploads' कंसोल पर उत्पादन प्रति के रूप में नामित कर रहे हैं (और जवाबी कार्रवाई के लिए, आप end हैंडलर में देख सकते हैं)।

संबंधित मुद्दे