2011-08-15 56 views
4

我正在开发一个涉及文件上传的NodeJS项目。上传与代码在客户端完成:NodeJS Web应用程序文件上传文件开始

$('#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

我想通了。在我的路由被定义和运行的实际文件上传代码之间有太多的逻辑,因为它没有准备好监听文件。

2

我有这个完全相同的问题。令我困扰的是,请求和on('data')事件之间的逻辑太多是问题所在。我使用本地服务器进行测试,请求开始和注册数据事件之间的逻辑量是微不足道的,但事实是我不需要通过互联网来上传这个问题就是这个问题那更糟?你还在遇到这个问题吗?

+0

我也有这个问题。我通过保存文件解决了这个问题,然后处理了其他需要的操作,比如将元信息保存到表格等。 – Damodaran

相关问题