2011-08-15 11 views
4

私はNodeJSのプロジェクトでファイルのアップロードを行っています。このコードは、単独で作業しないNodeJS Webアプリケーションファイルアップロードの開始オフファイルの先頭

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!!!!'); 
     }); 
    } 
}); 

が、私の残りの部分と組み合わせたとき:私が使用して、

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

とサーバー側で:アップロードは、コードをクライアント側で実行されますはるかに大きなプロジェクトは、それは大きなファイルの始まりを切り刻み、すべて一緒に小さなファイルを無視するようだ。小さなファイルをアップロードすると、console.log( 'DATA')は決して起動せず、大容量ファイルに対しては起動しますが、ファイルの先頭には実行されません。私は何らかの理由でそれがファイルを早く送信していると信じています。私の関数が最初にそれをピックアップするとき(または小さなファイルの場合は、全体が)すでに送信されています。しかし、私はこれを引き起こしているのか分かりません。

ありがとうございます!

答えて

2

私はそれを理解しました。私のルートが定義されている間に実際のファイルアップロードコードが実行されていて、ファイルを聞く準備ができていないということは、非常に多くの論理がありました。

2

私はまったく同じ問題を抱えています。要求とon('data')イベントの間にあまりにも多くのロジックを持つことは問題です。私はローカルサーバーでテストを行っており、リクエストの開始とデータイベントの登録の間のロジックの量はごくわずかですが、アップロードを行うためにインターネットを経由する必要はないという事実がこの問題を引き起こしていますこの問題がまだ残っていますか?

+0

私もこの問題を抱えていました。ファイルを保存して解決し、メタ情報をテーブルなどに保存するなどのその他の操作を処理します。 – Damodaran