2017-03-12 2 views
1

この質問は以前に公正なビットが要求されていましたが、私が見たソリューションはどれも動作していないようです。私が最終的に望むCSVはプライベートS3バケットにあり、セキュリティミドルウェアのためにNodeJSエンドポイント経由で取得する必要があります。 APIのコードは次のとおりです。角を使用してCSVファイルをトリガする

exports.download = function(req, res) { 

    var recording = req.vsRecording, 
     s3 = new AWS.S3(); 

    if(recording.data_uri){ 
     try{ 
      res.set('Content-Type', 'application/octet-stream'); 
      var fileStream = s3.getObject({Bucket: 'processing-dispatched', Key: recording._id + '/aggregated.csv'}).createReadStream(); 
      fileStream.pipe(res); 
     } 
     catch(err){ 
      res.status(500).json({error: err}); 
     } 
    } 
    else { 
     res.status(500).json({error: 'Recording does not have a report file.'}); 
    } 
}; 

これは完全に機能し、ファイルの内容をブラウザに戻すことができます。間違ってしまうと、そのコンテンツをファイルダウンロードとして開くようにしようとしています。ストリームのダウンロードを処理する特別な方法はありますか?

私が持っているのはクライアント上のこのコードです。このコードは、adblockerをオフにするとlocalhostで動作するようですが、実際には動作しません。

$scope.download = function(){ 
    Report.download($state.params.recordingId).then(function(data){ 
    var csvContent = "data:text/csv;charset=utf-8," + data.toString(); 
    var encodedUri = encodeURI(csvContent); 
    window.open(encodedUri); 
}); 

Report.downloadは、それは約束を返し、データ変数内のファイルの内容を解決し、ちょうど私のノードのエンドポイントの周りの角度サービスラッパーです。

答えて

1

理由がブラウザが新しいウィンドウをブロックしている可能性があります。 ブラウザ設定ですべてのサイトにポップアップを表示させる。

は、あなたは以下のコードは非常に賢いです

$scope.download = function() { 
Report.download($state.params.recordingId).then(function(data) { 
    var csvContent = "data:text/csv;charset=utf-8," + data.toString(); 
    var a = document.createElement('a'); 
    a.href = "data:application/csv;charset=utf-8," + csvContent; 
    a.setAttribute('download', "abc.csv"); 
    document.body.appendChild(a); 
    a.click(); 
    document.body.removeChild(a); 
}); 
} 
+0

を試すことができますfsnodeでファイルを作成し、さまざまな方法で事を試してみて、Front-end

または

へのURLを返すことができます!私はこれをやったが、私の元の質問に少し微調整して終わった。ファイルをブラウザにスチームするのではなく、有効期限が15分のS3ファイルの署名済みURLを作成しました。その後、このURLをブラウザに戻して、このコードを使用してhrefを設定し、リンクをクリックしました。 – Mark

関連する問題