nodejs表示和file upload

好了,所以我已经尝试使用连接forms,我不能得到它的工作原因,但我想我应该明白这是如何工作从零开始不pipe。

我不知道我上传的multipart / formdata文件在哪里,或者当我的应用程序发布到url时,如何访问它。 – 喜欢直接访问文件数据,并使用节点fs模块写入文件输出。 – 例如:

app.post('/testy', function(req, res){ console.log(req.body); console.log(req.headers); res.redirect('back'); }); app.get('/testy', function(req, res){ res.send('<form method="post" action="/testy" enctype="multipart/form-data">' + '<p>Image: <input type="file" name="test" /></p>' + '<p><input type="submit" value="Upload" /></p>' + '</form>'); }); 

所以实际上被logging在那里的唯一req var是req标头,body是空的。 (可能应该是我明白了)。 但我没有得到的是文件数据在哪里? 寻找$ _FILES数组的php equiv我想。 – 这是我的标题logging。

 'accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-language': 'en-us,en;q=0.5', 'accept-encoding': 'gzip,deflate', 'accept-charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'keep-alive': '115', connection: 'keep-alive', referer: 'http://127.0.0.1:3000/testy', cookie: 'connect.sid=lDRpluTxjUJeuTmkXlybrYeZ.JYTB155s2DGce2dsyfv1Op5ISCY8uqyqJZK8NjlZ5jM; socketio=flashsocket', 'x-insight': 'activate', 'content-type': 'multipart/form-data; boundary=---------------------------5856401949371863571646035001', 'content-length': '30128' } 

任何灯光stream失什么林缺失总是非常感激!

这是非常详细的版本,没有连接forms。 正如你所看到的,这不是有效的,但是试图对它是如何工作有启发性的。

 var express = require('express'), fs = require('fs'); app = express.createServer(); app.post('/testy', function(req, res){ var body = ''; var header = ''; var content_type = req.headers['content-type']; var boundary = content_type.split('; ')[1].split('=')[1]; var content_length = parseInt(req.headers['content-length']); var headerFlag = true; var filename = 'dummy.bin'; var filenameRegexp = /filename="(.*)"/m; console.log('content-type: ' + content_type); console.log('boundary: ' + boundary); console.log('content-length: ' + content_length); req.on('data', function(raw) { console.log('received data length: ' + raw.length); var i = 0; while (i < raw.length) if (headerFlag) { var chars = raw.slice(i, i+4).toString(); if (chars === '\r\n\r\n') { headerFlag = false; header = raw.slice(0, i+4).toString(); console.log('header length: ' + header.length); console.log('header: '); console.log(header); i = i + 4; // get the filename var result = filenameRegexp.exec(header); if (result[1]) { filename = result[1]; } console.log('filename: ' + filename); console.log('header done'); } else { i += 1; } } else { // parsing body including footer body += raw.toString('binary', i, raw.length); i = raw.length; console.log('actual file size: ' + body.length); } }); req.on('end', function() { // removing footer '\r\n'--boundary--\r\n' = (boundary.length + 8) body = body.slice(0, body.length - (boundary.length + 8)) console.log('final file size: ' + body.length); fs.writeFileSync('files/' + filename, body, 'binary'); console.log('done'); res.redirect('back'); }) }); app.get('/testy', function(req, res){ res.send('<form method="post" action="/testy" enctype="multipart/form-data">' + '<p>Image: <input type="file" name="test" /></p>' + '<p><input type="submit" value="Upload" /></p>' + '</form>'); }); app.listen(4000); 

如何从示例库运行此片段?

https://github.com/visionmedia/express/blob/master/examples/multipart/app.js

 /** * Module dependencies. */ var express = require('express') , form = require('connect-form'); var app = express.createServer( // connect-form (http://github.com/visionmedia/connect-form) // middleware uses the formidable middleware to parse urlencoded // and multipart form data form({ keepExtensions: true }) ); app.get('/', function(req, res){ res.send('<form method="post" enctype="multipart/form-data">' + '<p>Image: <input type="file" name="image" /></p>' + '<p><input type="submit" value="Upload" /></p>' + '</form>'); }); app.post('/', function(req, res, next){ // connect-form adds the req.form object // we can (optionally) define onComplete, passing // the exception (if any) fields parsed, and files parsed req.form.complete(function(err, fields, files){ if (err) { next(err); } else { console.log('\nuploaded %s to %s' , files.image.filename , files.image.path); res.redirect('back'); } }); // We can add listeners for several form // events such as "progress" req.form.on('progress', function(bytesReceived, bytesExpected){ var percent = (bytesReceived / bytesExpected * 100) | 0; process.stdout.write('Uploading: %' + percent + '\r'); }); }); app.listen(3000); console.log('Express app started on port 3000'); 

 npm install express npm install connect-form node app.js 

适合我…

我能够得到连接forms包最终工作,菜鸟的错误,但是,如果你使用快速请确保你告诉应用程序使用你的configurationfunctionapp.configure(function(){app.use(form ({keepExtensions:true}));

(在文章中它将在files.yourfileuploadfieldname.filenamevariables中)

– 说那我仍然有兴趣知道如何做,从头开始,没有连接forms,如果它不是难以置信的难以解释。