2011-08-15 57 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

相關問題