如何读取从Web客户端发送的nodejs Server中的文件

时间:2012-11-29 05:18:55

标签: node.js file-io

我是nodeJS和Java Script的新手。 我需要实现一种机制来读取从Web客户端发送的nodeJS服务器中的文件。

任何人都可以给我一些指针如何做到这一点? 我在nodeJS文件系统中找到了readFileSync(),它可以读取文件的内容。但是如何从Web浏览器发送的请求中检索文件?如果文件非常大,那么在nodeJS中读取该文件中内容的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

formidable是一个非常方便的库,用于处理表单。

以下代码是一个功能齐全的示例节点应用程序,我从formidable的github中获取并稍加修改。它只是在GET上显示一个表单,并在POST上处理表单上传,读取文件并回显其内容:

var formidable = require('formidable'),
    http = require('http'),
    util = require('util'),
    fs = require('fs');

http.createServer(function(req, res) {
  if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
    // parse a file upload
    var form = new formidable.IncomingForm();

    form.parse(req, function(err, fields, files) {
      res.writeHead(200, {'content-type': 'text/plain'});

      // The next function call, and the require of 'fs' above, are the only
      // changes I made from the sample code on the formidable github
      // 
      // This simply reads the file from the tempfile path and echoes back
      // the contents to the response.
      fs.readFile(files.upload.path, function (err, data) {
        res.end(data);
      });
    });

    return;
  }

  // show a file upload form
  res.writeHead(200, {'content-type': 'text/html'});
  res.end(
    '<form action="/upload" enctype="multipart/form-data" method="post">'+
    '<input type="text" name="title"><br>'+
    '<input type="file" name="upload" multiple="multiple"><br>'+
    '<input type="submit" value="Upload">'+
    '</form>'
  );
}).listen(8080);

这显然是一个非常简单的例子,但强大的功能对于处理大型文件也很有用。它使您可以在处理时访问已解析的表单数据的读取流。这允许您在上载数据时处理数据,或将数据直接传输到另一个流中。

// As opposed to above, where the form is parsed fully into files and fields,
// this is how you might handle form data yourself, while it's being parsed
form.onPart = function(part) {
  part.addListener('data', function(data) {
    // do something with data
  });
}

form.parse();

答案 1 :(得分:1)

您需要解析http请求的正文,该请求可以包含HTML文件输入中的文件。例如,当使用带有节点的快速Web框架时,您可以通过HTML表单发送POST请求,并通过req.body.files访问任何文件数据。如果您只是使用节点,请查看“net”模块以帮助解析http请求。