2016-12-21 15 views
0

私はexportCSV関数を呼び出すボタンを持っています。この関数は、私のpostgresデータベースに対してselect文を実行し、AJAXリクエストを介して結果を返します。データベースへのAJAXリクエスト - .csvファイルをダウンロード

ブラウザからクライアントに返された応答の内容を.csvファイルとして取得するにはどうすればよいですか?現在のところ、コードはブラウザコンソールでのみ応答します。アドバイスをいただければ幸いです。 phpが起動すると、データベースのやり取りを行うsmarthandlerクラスがあります。

exportCSV機能

exportCSV: function() { 
    var me = this; 
    var message = 'Are you sure you want to generate the CSV?'; 
    var icon = Ext.Msg.QUESTION; 

    Ext.Msg.show({ 
     title: 'Confirm Execution', 
     message: message, 
     buttons: Ext.Msg.YESNO, 
     icon: icon, 
     fn: function(btn) { 
      if(btn === 'yes') { 
       // TODO: Probably should handle an error here. 
       Ext.Ajax.request({ 
        url: 'data.php', 
        async: true, 
        params: { 
         action: 'export-csv', 
         id: me.currentRecord.data.id, 
         type: 'Carrier' 
        }, 
        success: function(response,opts) { 
         var data = Ext.decode(response.responseText); 
         var csvContent = "data:text/csv;charset=utf-8,"; 
         data.forEach(function(infoArray, index){ 
          dataString = infoArray.join(","); 
          csvContent += index < data.length ? dataString+ "\n" : dataString; 
         }); 
         var encodedUri = encodeURI(csvContent); 
         var link = document.createElement("a"); 
         link.setAttribute("href", encodedUri); 
         link.setAttribute("download", "carrier_profile.csv"); 
         document.body.appendChild(link); // Required for FF 

         link.click(); // This will download the data file named "carrier_profile.csv". 
        } 
       }); 
      } 
     } 

    }); 
} 

PHPは

else if($action == 'export-csv') { 
// Create an array of filters. 
$parsedFilters = array(); 
// TODO: Sanitize the properties better. 
if(isset($_REQUEST['filter'])) { 
    $filters = json_decode($_REQUEST['filter']); 
    foreach($filters as $record) 
     array_push($parsedFilters,array($record->property => $record->value)); 
} 

// Convert a request for a specific ID into a filter. 
if(isset($_REQUEST['id'])) 
    array_push($parsedFilters,array('id' => $_REQUEST['id'])); 

$objectHandler = new SmarterHandler($typeDefinition); 
$records = $objectHandler->read($type,$parsedFilters); 

header('Content-type: text/csv'); 
header('Content-disposition: attachment;filename=file.csv'); 

if(count($records) > 0) { 
    $record = $records[0]; 
    $headings = array(); 
    foreach($record as $key => $value) { 
     if(is_scalar($value)) { 
      $headings[] = $key; 
      echo $key.","; 
     } 
    } 

    echo "\r\n"; 

    foreach($records as $record) { 
     foreach($headings as $key) { 
      echo $record[$key].","; 
     } 

     echo "\r\n"; 
    } 
} 

exit(); 

は}

答えて

0

私はあなたがaccepted answer for this questionの手順に従うことによって達成することができます探しているものだと思います。

あなたは隠されたリンクを作成し、クリックに応答パトリックため

var encodedUri = encodeURI(csvContent); 
var link = document.createElement("a"); 
link.setAttribute("href", encodedUri); 
link.setAttribute("download", "my_data.csv"); 
document.body.appendChild(link); // Required for FF 

link.click(); // This will download the data file named "my_data.csv". 
+0

感謝をエミュレートすることができ、それをダウンロードするには、あなたが(CSVデータの前にdata:text/csv;charset=utf-8を含む)が正しくフォーマットされたデータを持っていると仮定。これは魅力のように機能します。 しかし、どのようにデータを私のSQLクエリでpostgresqlに取り込むのですか?この例で提供されるハードコードされた値を使用して完全に動作します。 var data = [["name1"、 "city1"、 "some other info"]、["name2"、 "city2"、 "more info"]]; – Jukebox

+0

@Jukeboxあなたの質問を理解しているかどうか分からない...あなたのデータベースでSQLクエリを実行する際に問題がありますか?または、クエリの応答を解析する際に問題が発生しましたか? –

+0

@T Patrick ...私はSQLクエリをうまく実行し、ブラウザの検査ウィンドウでその応答を見ることができます。この例では、csvが移入される "data"変数を静的に設定しています - SQLクエリから返される情報に "data"変数を設定するにはどうすればいいですか? – Jukebox

関連する問題