2016-06-29 22 views
2

私はそうのようなnodejsルータにWebページからのXMLHttpRequestを送信:nodejsでファイルをダウンロードできないのはなぜですか?

var name = $(this).find('td:eq(0)').html(); 
     var docNum = $('#docNum').val(); 
     //alert("fileName=" + name + "&docNum=" + docNum); 
     xhttp = new XMLHttpRequest(); 
     xhttp.onreadystatechange = function() { 
      if (xhttp.readyState == 4 && xhttp.status == 200) { 
       isUnique = xhttp.responseText; 
       if(isUnique == "false"){ 
        alert("ID is not unique please pick another document ID "); 
       }else{ 
        $("form#docForm").submit(); 
       } 
      } 
     }; 
     xhttp.open("POST", "/downloadDocument", true); 
     xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     var params = "fileName=" + name + "&docNum=" + docNum; 
     xhttp.send(params); 

そして、これが正常に動作し、要求がルータに取得し、ルータが正しく変数の両方を読み取ることができます。

これは正常に動作しないルータコードの一部です:

router.post("/downloadDocument", function(req, res){ 
     var doc = req.body.docNum; 
     var fileName = req.body.fileName; 
     var document = Document.findOne({Name: fileName, Dossier: doc}, function(err, obj){ 
      var path = obj.Name; 
      console.log(path); 
      fs.writeFile(obj.Name, obj.File); 
      res.download("./" + obj.Name); 
     }); 
    }); 

そして、それがないすべては、前のページに私をリダイレクトしている、それもファイルが、ファイルをダウンロードしません。存在し、私は理由を知らない。

私もここで

var filestream = fs.createReadStream(obj.File); 
    filestream.pipe(res); 

代わりのres.download

を使用してみましたが、この要求のコンソール出力です:

Apples.jpg 
POST /downloadDocument 200 4.814 ms - - 
POST /dossierEdit 302 12.898 ms - 62 #This part concerns me and redirects me while i do not ask for this page in my code 
GET /dossiers 304 20.793 ms - - 
GET /public/stylesheets/css/bootstrap.min.css 304 2.737 ms - - 
GET /public/stylesheets/css/simple-sidebar.css 304 2.921 ms - - 
GET /public/stylesheets/style.css 304 2.327 ms - - 
GET /public/stylesheets/css/font-awesome.min.css 404 3.502 ms - 56 
GET /public/css/style.css 404 1.097 ms - 33 
GET /public/stylesheets/css/font-awesome.min.css 404 0.492 ms - 56 
GET /public/css/style.css 404 1.107 ms - 33 

だけ明確にするために、私の目標はにありますファイルをクライアントに送信し、サーバーに保存しないでください。

+0

はDocument.findOne()のコールバック関数です。ログにパスが表示されますか? (console.log(path)のため) – frank

+0

はいコールバックが実行され、私が入れたファイル名だけで表示されるパスが表示されます。私が入れていないファイルをダウンロードしようとするとコンソールエラーが表示されます –

+0

findOneはMongooseを使ったmongoDBリクエストです。mongoデータベースにファイルを保存し、findOne関数を使ってダウンロードしたいファイルをリクエストし、fs.writeFileを使ってローカルファイルを作成します。ローカルに、私はそれらを開くことができます)と今私がしようとしているものは、動作していないそれらをダウンロードしています。 –

答えて

2

私はいくつかの問題があると信じています。

  1. Files cannot be downloaded via an ajax call
  2. fs.writeFile(obj.Name, obj.File)呼び出しは非同期であるため、(1)が問題ではない場合でも、res.download("./" + obj.Name)が呼び出されたときにファイルが に存在しない可能性があります。代わりにfs.writeFileSyncを使用してください。
  3. $("form#docForm").submit()コールが返されるため、前のページにリダイレクトされる可能性があります。この呼び出しは、ajax呼び出しが返されたときに発生し、別のページにフォームを送信します。

問題を解決するには、ポストデータを含む実際のフォームを「/downloadDocument」エンドポイントに提出してください。これは、ajax呼び出しではなく、

私は役立つことを願っています。

+0

私は今、jqueryから$ postを使用して、動作する投稿要求を送信し、それをページに戻します。コールバック関数を使用して印刷できますが、ファイルをダウンロードしないで、私は今、createReadStreamとfilestream.pipe(res)を使ってデータを送り返します。どのようにこれを修正するための任意のアイデア? –

+0

私は、通常の投稿をするのはオプションではないと思います。 [download.js](http://danml.com/download.html)を見て、それを送り返すデータからblobを作成し、それをクライアントサイトにダウンロードすることができます。古いブラウザでは動作しませんので、ブラウザのサポートが必要な場合は他のオプションを検討してください。 –

+0

私は定期的なポストを試すことができますが、それは、ファイルをダウンロードするためにテーブルの行をクリック可能にしてから、むしろ醜い、難しいと思う不要な隠しフォームを必要としますが、まずdownload.jsをチェックします助け、それは私の多くを助けた:) –

関連する問題