Node.js AJAX文件上传器

时间:2010-09-16 10:52:48

标签: javascript jquery ajax node.js file-upload

我正在尝试使用AJAX进度条创建一个Node.js文件上传器。

var formidable = require('./formidable'), http = require('http'), sys = require('sys');
 http.createServer(function(req, res) {
  if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
    // parse a file upload
    var form = new formidable.IncomingForm();
    form.uploadDir = './node_uploads';
    form.keepExtensions = true;
    //print the upload status in bytes
    form.addListener("progress", function(bytesReceived, bytesExpected) {
        //progress as percentage
        progress = (bytesReceived / bytesExpected * 100).toFixed(2);
        mb = (bytesExpected / 1024 / 1024).toFixed(1);
        sys.print("Uploading "+mb+"mb ("+progress+"%)\015");
    });
    //enter here after upload complete
    form.parse(req, function(fields, files) {
        sys.debug("Upload Complete");
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('received upload:\n\n');
        res.end());
    });
    return;
  }
  if (req.url == '/update') {
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('<?xml version="1.0"?><response><status>1</status><message>'+ 000 +'</message> </response>');
        res.end();

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

jQuery非常冗长,所以我把它删除了,但它只是启动一个计时器并从更新请求数据并在标签上设置。

使用此代码,节点会接受来自不同主机的多个上传吗? Firefox似乎也没有用,但Safari / Chrome有什么想法吗? 我如何申请文件上传状态?

谢谢,Alex

2 个答案:

答案 0 :(得分:1)

您需要的一件事是一种唯一标识特定上传的方法。表单应包含唯一ID作为标识上载的隐藏字段。然后,在进行上传时,您可以保留ID地图 - &gt;进度级别和“更新”调用将传递该ID以确保它正在查看正确的进度指示器。

然而,您可能会发现浏览器只允许有限数量的服务器连接。因此,您的进度更新请求可能会等到实际上传完成后才会发送到服务器。

要解决此问题,您可能需要使用socket.io打开与开始上传前保持打开状态的服务器的连接,并在上传过程中接收该连接的更新。

答案 1 :(得分:0)

为了回答第三个问题

  

我如何申请文件上传状态?

Formidable有一个“progess”事件:

Event: 'progress' (bytesReceived, bytesExpected)

通过这种方式,您可以轻松跟踪进度并将其返回到准备好的更新通话中。

因此,只需在您的更新通话中使用您的ajax进行轮询,例如会话ID或双方都知道的其他唯一标识符。