2016-09-04 73 views
1

我必須使用$ .post()將數組從JS傳遞到PHP,使用數組創建文件並下載它。將數據從js傳遞到php並下載創建的csv文件

使用此傳遞數組:

$('#csv').click(function() { 
$.post(
    window.location + "crawler/save_to_file", 
    { 
     dane: wynik //array 
    }); 
    }); 
在PHP

現在使用此:

$tablica=$_POST['dane']; 
$filename = "export-to-csv.csv"; 
       header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
       header("Content-type: text/csv"); 
       header("Content-Disposition: attachment; filename=\"$filename\""); 
       header("Expires: 0"); 
       $fh = fopen('php://output', 'w'); 
       $heading = false; 
       if(!empty($tablica)) 
        foreach($tablica as $row) { 
         if(!$heading) { 
          fputcsv($fh, array_keys($row)); 
          $heading = true; 
         } 
         fputcsv($fh, array_values($row)); 
       } 
       fclose($fh); 

但是,當點擊按鈕來創建和下載文件,沒有任何反應。

感謝

代碼更新

JS文件:

$.ajax({ 
     url: window.location + "crawler/", 
     type: "POST", 
     dataType: "json", 
     data: { 
      wartosc: zmienna 
     }, 
     success: function (odp) { 
      wynik = odp; //array 
      tab = JSON.stringify(odp); 
      $.post(window.location + "crawler/return_data", 
       { 
        data: tab 
       }, 
       function (data) { 
        $('#wynik').html(data); 
        $('.pobierz').show(); 
       } 
      ) 
     } 
    }) 


$('.button').click(function() { 
    var $form = $('<form action="' + window.location + 'crawler/save_to_csv" method="post"></form>'); 
    $.each(wynik, function() { 
     $('<input type="hidden" name="dane[]">').attr('value', this).appendTo($form); 
    }); 
    $form.appendTo('body').submit(); 
}); 

而在PHP文件的var_dump陣列:

function save_to_csv() 
{ 
    $tablica=$_GET['dane']; 
    var_dump($tablica); 

} 

回報:「未定義指數:丹麥」

編輯

$ tablica必須$_POST沒有$_GET

+0

你檢查了'不爲空$ data'哪裏是'$ data'設置? – RST

+0

哦忘了改變代碼編寫問題的變量,現在更新 – Marcin

回答

1

這可以用AJAX可以做到,但你需要使用文件API。 所以你做這樣的事情:

$.post("csv.php", { 
    dane: wynik //array 
}, function(response){ 
    var blob = new Blob([response], { type:'text/csv' }); 
    alert(URL.createObjectURL(blob)); 
}); 

你從警報獲取URL,包含CSV文件。

當然,如果你想直接到文件替換與警報:

window.location.href=URL.createObjectURL(blob); 

UPDATE

如果你想使用自定義的文件名,還有一個辦法通過使用a元素掩蓋由URL.createObjectURL()生成的url。 我們可以使用新的HTML5屬性download,它允許我們屏蔽網址。

下面是更新後的代碼:

$.post("csv.php", { 
    dane: wynik //array 
}, function(response){ 
    var blob = new Blob([response], { type:'text/csv' }), 
     a = document.createElement('a'), 
     url = URL.createObjectURL(blob); 

    // Put the link somewhere in the body 
    document.body.appendChild(a); 
    a.innerHTML = 'download me'; 
    a.href = url; 
    // Set our custom filename 
    a.download = 'myfilename.csv'; 
    // Automatically click the link 
    a.click(); 
}); 
+0

它的工作,但我可以更改下載的文件的名稱? – Marcin

+1

@Marcin查看更新的答案。 – MarcHoH

+0

謝謝,如果使用這個如何做到這一點:window.location.href = URL.createObjectURL(blob); – Marcin

0

你不得不使用AJAX到陣列發送到你的PHP代碼?如果是的話,it is not really possible

如果不是,而不是你的AJAX調用,你可以建立一個隱藏的表單,隱藏的輸入包含你的數組項並通過JavaScript提交。

UPDATE 簡短的例子與JS建築形式:

$('#csv').click(function() { 
    var $form = $('<form action="' + window.location + 'crawler/save_to_file" method="post"></form>'); 
    $.each(wynik, function() { 
    $('<input type="hidden" name="dane[]">').attr('value', this).appendTo($form); 
    }); 
    $form.appendTo('body').submit(); 
}); 
+0

你可以給我鏈接的例子嗎? – Marcin

+0

剛剛更新了我的答案與示例代碼。 –

+0

錯誤:使用$ _POST ['dane']嘗試捕獲php文件中的數組時出現「Undefined index:dane」; – Marcin