NodeJS Web App文件上传切断文件的开头

时间:2011-08-15 12:44:05

标签: ajax node.js upload xmlhttprequest

我正在研究NodeJS中涉及文件上传的项目。上传在客户端完成,代码为:

$('#file-upload').bind('change focus click', function() {
    var file = jQuery(this)[0].files[0];
    if (file && file.fileName) {
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener('progress', onProgressHandler, false);
        xhr.upload.addEventListener('load', transferComplete, false);
        xhr.open('POST', '/upload', true);
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.setRequestHeader('X-File-Name', encodeURIComponent(file.fileName));
        xhr.setRequestHeader('Content-Type', 'application/octet-stream');
        xhr.send(file);


        function onProgressHandler(evt) {
            var percentage = event.loaded/event.total*100;
            console.log(percentage);
        }
        function transferComplete(evt) {
            console.log('Done');
        }
    }
});

在服务器端,我使用:

app.post('/upload', function(req, res, next) {
    if(req.xhr) {
        console.log('Uploading...');
        var fName = req.header('x-file-name');
        var fSize = req.header('x-file-size');
        var fType = req.header('x-file-type');
        var ws = fs.createWriteStream('./'+fName)

        req.on('data', function(data) {
            console.log('DATA');
            ws.write(data);
        });
        req.on('end', function() {
            console.log('All Done!!!!');
        });
    }
});

这段代码确实可以单独使用,但是当与我的大型项目的其余部分结合使用时,它似乎会切断大文件的开头,并忽略所有小文件。如果我上传一个小文件,console.log('DATA')永远不会触发,它会触发大文件,但不会触发文件的开头。我相信由于某种原因,它是提前发送文件,当我的功能从头开始(或在小文件的情况下,整个事情)已经发送。不过,我不知道会造成什么。

谢谢!

2 个答案:

答案 0 :(得分:2)

我明白了。我的路由被定义和运行的实际文件上传代码之间存在很多逻辑,因为它还没有准备好侦听文件。

答案 1 :(得分:2)

我遇到了同样的问题。令我困扰的是,在请求和on('data')事件之间存在太多逻辑是问题所在。我正在使用本地服务器进行测试,并且请求开始和注册数据事件之间的逻辑数量可以忽略不计。但是我不需要通过互联网进行上传就是这个问题那更糟糕了吗?你还在经历这个问题吗?