File io nodejsexpress和文件上传

File io nodejsexpress和文件上传,file-io,node.js,express,File Io,Node.js,Express,好吧,我已经试过使用连接表单了,但由于某些原因,我无法让它工作,但我想我应该从零开始理解它是如何工作的 我不知道我上传的multipart/formdata文件要去哪里,或者当它发布到url时,我如何在我的应用程序中访问它。-我想直接访问文件数据,并使用节点fs模块写入文件输出。-例如: app.post('/testy', function(req, res){ console.log(req.body); console.log(req.headers);

好吧,我已经试过使用连接表单了,但由于某些原因,我无法让它工作,但我想我应该从零开始理解它是如何工作的

我不知道我上传的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>');
    });

任何关于我所错过的东西的信息,我都将一如既往地感激

从示例库运行此代码段怎么样



对我来说效果很好…

我终于可以让connect表单包正常工作了,新手错误,但是,如果您使用的是express,请确保告诉应用程序使用配置函数app.configure(function()中的表单模块{ app.use(form({keepExtensions:true}))

(在文章中,它将位于files.yourfileuploadfieldname.filename变量中)


--尽管如此,我仍然有兴趣知道如何从头开始,没有连接形式,如果它不是难以置信地难以解释的话。

这里有一个非常详细的版本,没有连接形式。正如你所看到的,这不是有效的,但试图对它的工作原理有所启发

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);
var express=require('express'),
fs=要求('fs');
app=express.createServer();
app.post('/testy',函数(req,res){
变量体=“”;
var头=“”;
var content_type=req.headers['content-type'];
变量边界=内容类型。拆分(“;”)[1]。拆分(“=”)[1];
var content_length=parseInt(请求头['content-length']);
var headerFlag=真;
var filename='dummy.bin';
var filenameRegexp=/filename=“(.*)”/m;
console.log('content-type:'+content\u-type);
console.log('boundary:'+boundary);
console.log('content-length:'+content\u-length);
请求开启('数据',功能(原始){
console.log('接收到的数据长度:'+raw.length);
var i=0;
而(i<原始长度)
如果(头饰){
var chars=raw.slice(i,i+4).toString();
如果(字符=='\r\n\r\n'){
headerFlag=假;
header=raw.slice(0,i+4).toString();
log('header length:'+header.length);
log('header:');
console.log(头文件);
i=i+4;
//获取文件名
var result=filenameRegexp.exec(头);
如果(结果[1]){
filename=结果[1];
}
log('filename:'+filename);
log('header done');
}
否则{
i+=1;
}
}
否则{
//解析包含页脚的正文
body+=raw.toString('binary',i,raw.length);
i=原始长度;
log('实际文件大小:'+body.length);
}
});
请求on('end',function(){
//正在删除页脚'\r\n'--边界--\r\n'=(boundary.length+8)
body=body.slice(0,body.length-(boundary.length+8))
log('最终文件大小:'+body.length);
fs.writeFileSync('files/'+文件名,body,'binary');
console.log('done');
res.redirect(“back”);
})
});  
app.get('/testy',函数(req,res){
res.send(“”)
+“图像:

” +“

” + ''); }); app.listen(4000);
Way to go!令人惊讶的是,网上有多少上传示例不起作用。我不敢相信这真的起作用了!我整天都在寻找一个能起作用的!Cirrostratus它不起作用,因为nodejs的API经常变化。这是2011年7月1日写的,你在9个月后于2012年4月30日评论过的。@hiteshjoshi我没说这个例子不起作用。我称赞这个例子是因为它对我起作用。哎呀,对不起。我读这个时很困。你知道编码员的生活:P,请忽略。
/**
 * 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
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);