2016-10-16 6 views
0

私はJavaでRESTサービスを持っており、クライアントにファイルを送信するエンドポイントを持っています(HTTP GET、/ file)。私のフロントエンドのクライアントはNodeJSです。私はRESTサービスからファイルをダウンロードできません。特定の場所にのみファイルを保存できますが、他のダウンロードダイアログボックスと同様に、ユーザーがファイルを保存できるダウンロードダイアログボックスが必要です。マイNodeJSコードは以下の通りです:NodeJSのサーバーからファイルをダウンロードします

router.get('/openFile',function(req,res){ 
    native_data_retrieval_rest_client.get("http://localhost:8080/file?fileName=presentation.pcap",function(data){ 
     var fileName="/home/files/presentation.pcap"; 
     res.download(data);//This doesnt open dialogue box 

     fs.writeFile(fileName, data, function (err) { 
      if (err) { 
       //Error handling 
      } else { 
       console.log('Done'); 
      } 
     }); 
    }); 
}); 

ファイルが場所/home/files/presentation.pcapに静的に保存されます。

response.setHeader("Content-Disposition", "attachment; filename=" 
        + fileName); 
      response.setHeader("Content-Type", type); 

      reportBytes = new byte[131072];// New change 
      OutputStream os = response.getOutputStream();// New change 
      int read = 0; 
      while ((read = inputStream.read(reportBytes)) != -1) { 
       os.write(reportBytes, 0, read); 
      } 
      //System.out.println("Bytes sent" + reportBytes); 
      os.flush(); 
      os.close(); 

そして、私はNodeJS側で取得する結果はそれで、ファイルの内容と警告ボックスのようなものです:

私のRESTサービス側の応答は以下のようなものです。以下の出力を参照してください:

enter image description here

誰も私が私がここでやって何を間違えお知らせくださいことができます。ユーザーが[ダウンロード]ボタンをクリックすると、ダウンロードダイアログボックスが表示されます。ダウンロードボタンをクリックすると、RESTサービスが呼び出され、NodeJSのフロントエンドにファイルが送信され、ダイアログボックスが開き、ユーザーにその場所を尋ねるメッセージが表示されます。

HTMLから私のコールが

tr.append("td").append("button") 
.on("click", function(){ 

      openFile(); 
      }) 

function openFile(){ 
      alert("button clicked"); 

      $http.get('/openFile/').success(function(response) { 
       console.log(response.response); 
      }).error(function(error){ 
       alert(error); 
      }); 

      } 
+0

どのようにリクエストしていますか?それはあなたのサイトのajaxまたはダウンロードリンクを介してですか? – JoeMoe1984

+0

はいthrough the ajax ... HTML部分で質問を更新しました –

答えて

1

res.download(以下のようなものですが)データになりません。それはファイルパスを取る。

var fileName = "presentation.pcap"; 
var filePath = "/home/files/" + fileName; 

fs.writeFile(filePath, data, function (err) { 
    if (err) { 
     //Error handling 
    } else { 
     console.log('Done'); 
     res.download(filePath, fileName, function(err) { 
      console.log('download callback called'); 
      if(err) { 
       console.log('something went wrong'); 
      } 

     }); // pass in the path to the newly created file 
    } 
}); 

更新

あなたはAJAX要求を使用している場合は、そのことはできませんダウンロードする

http://expressjs.com/en/api.html#res.download

あなたが成功したfs.writeFileコールバック内res.downloadを呼び出したいですこのようにファイル。ブラウザは、ajaxリクエストを通じてダウンロードを行うことを不可能にします。

あなたがしたいことは、URLを使用してアンカー要素でファイルをダウンロードすることだけです。

HTML

<a class="button" href="http://localhost:3000/openFile" target="_blank">Get request</a> 

あなたはJavaScriptでprogmaticallyそれを実行する必要がある場合は、window.open()メソッドを使用することができます。

Javascriptを

$('.button').click(function(e) { 
    e.preventDefault(); 
    window.open('http://localhost:3000/openFile', '_blank'); 
}); 

私は、この例ではjQueryを使用しますが、私はそれが何をすべきかを示すと思います。 window.open部分は重要な部分です。

+0

端末から「完了」ログが表示されますか? – JoeMoe1984

+0

はい私はログ上でdoneを見ることができます。また、ファイルは静的な場所に保存されています。 –

+0

コードは私のために働いています。私はres.downloadパラメータを調整し、エラーの場合にコールバック関数を追加しました。そのコードを実行すると、何かが間違ってコンソールに印刷されているのが見えますか? のres; – JoeMoe1984

関連する問題