2013-03-11 252 views
2

我正在嘗試使用AJAX POST請求提供簡單的下載。用戶點擊<span>並開始下載(或根據瀏覽器顯示下載對話框)。我已經實現了所有這些,但AJAX響應不會觸發任何瀏覽器下載行爲,我不知道爲什麼。通過AJAX POST下載文件

這裏是我的代碼:

HTML /枝:

<span id="export_csv">csv - click me to download the file</span> 

的javascript:

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#export_csv').click(function(){ 
    var params = "some params"; 
    $.ajax({ 
     type: 'POST', 
     url: "{{path('ExportBundle_export', {'format': 'csv','report' : 'basic'})}}", 
     data: params 
    }); 
    }); 
}); 
</script> 

控制器代碼(Symfony2的,但沒關係這裏):

$response = new Response(file_get_contents($document->getPath())); 
$response->setStatusCode(200); 
$response->headers->set('Content-Type', $document->getMime()); 
$response->headers->set('Content-Description', 'Submissions Export'); 
$response->headers->set('Content-Disposition', 'attachment; filename=' 
    . $filename . '.' . $format); 
$response->headers->set('Content-Transfer-Encoding', 'binary'); 
$response->headers->set('Pragma', 'no-cache'); 
$response->headers->set('Expires', '0'); 
return $response; 

這是例子E分別請求:

Request URL:http://myapp.local/app_dev.php/export/basic/csv 
Request Method:POST 
Status Code:200 OK 

和響應頭:

cache-control:private, must-revalidate 
Connection:close 
content-description:Submissions Export 
content-disposition:attachment; filename=report_1363013244.csv 
Content-Length:790 
content-transfer-encoding:binary 
Content-Type:text/csv; charset=UTF-8 
Date:Mon, 11 Mar 2013 14:47:24 GMT 
expires:0 
pragma:no-cache 
Server:Apache/2.2.22 (Ubuntu) 
x-debug-token:513dee7c99fdb 
X-Powered-By:PHP/5.3.10-1ubuntu3.5 

我檢查Network標籤在谷歌瀏覽螢火酷似工具欄和響應長相酷似文件。也許有什麼毛病我的頭,但我檢查了已經經過兩次......

PS 1

我想它使用AJAX來使(我寧願它不是創建一個HTML表單更多)。

PS 2

我在客戶端層(javascript)有很多參數。我需要在控制器(服務器端腳本)中提供所有這些功能。在使用AJAX時,我只是將它們傳遞給data鍵。

+0

爲什麼不只是'...'? – 2013-03-11 15:05:12

回答

4

我不明白你爲什麼要觸發ajax調用下載? 你爲什麼不做一個正規的<a href="download/me">Download</a>並設置該頁面的MIME類型。這樣,您可以運行任何php代碼,然後回顯一個MIME類型,這不會導致頁面重新加載,並且您將停留在您點擊的地方。

http://davidwalsh.name/php-header-mime

+0

原因是我在javascript層中有很多參數,我想用POST請求而不是GET來傳遞它們。假設你有10個參數要傳遞('param1','param2'等)到請求中。你將如何實現它不是爲了寫一個唯一的混亂(我的意思是難以理解的其他程序員)? – ducin 2013-03-11 15:10:44

+0

是的,正如你所看到的,'$'等等...... – ducin 2013-03-11 15:14:59

+0

對不起前面的問題 好的,這裏是你需要的http://api.jquery.com/serialize/,這將爲你做的代碼 – 2013-03-11 15:15:45

2

你不使用AJAX下載文件。

你只需要給像<a href="myFile.jpeg">的URL,但問題是,你必須使用標頭和URL Rewriting攔截請求強制下載:

在圖像的情況下:


$filename = basename($_GET['img']); // don't accept other directories 
$size = @getimagesize($filename); 
$fp = @fopen($filename, "rb"); 
if ($size && $fp) 
{ 
    header("Content-type: {$size['mime']}"); 
    header("Content-Length: " . filesize($filename)); 
    header("Content-Disposition: attachment; filename=$filename"); 
    header('Content-Transfer-Encoding: binary'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    fpassthru($fp); 
    exit; 
} 

在這種情況下..網址將不會改變(我認爲這是你想要的)

0

我不認爲它可能使用ajax,我有同樣的問題,下載沒有觸發。我的解決方案只使用PHP:

  1. 當頁面加載時,在背景上創建一個新文件。這將存儲在服務器位置。

    $out = fopen('filename', 'w+'); 
    //write data in file 
    fputcsv($out, some csv values); 
    
  2. 有客戶端的鏈接下載它

    <a href='<?php echo $filename;?>' >Export Data to CSV file</a> 
    

,並根據這是如何經常做的,你必須定期清理下載到不填服務器。