2013-07-27 29 views
1

我正在嘗試使用symfony2下載文件的鏈接。symfony2如何在Ajax中強制下載返回json數據類型

它確實下載了一個文件,但是它不能用於瀏覽器。我不知道如何使它工作。有人知道該怎麼辦?

jQuery代碼:

$.ajax({ 
     url: url, 
     type: "POST", 
     data: {id : id}, 
     dataType: "json", 
     success: function(resp){ 
      console.log(resp); 
     }, 
     error: function(x, y, z){ 
      //console.log(x); 
     } 
}); 

PHP代碼中的控制器:

$response = new Response(); 

// Set headers 
$response->headers->set('Cache-Control', 'private'); 
$response->headers->set('Content-type', mime_content_type($filename)); 
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"'); 
$response->headers->set('Content-length', filesize($filename)); 

// Send headers before outputting anything 
$response->sendHeaders(); 

$response->setContent(file_get_contents($filename)); 
+0

嘗試刪除sendHeaders呼叫 –

回答

0

有一個解決方案,兼容所有瀏覽器:不使用Ajax來做到這一點。相反,寫一個簡單的「location.href」指令,像這樣:

$("#download").on('click', function() { 
    location.href = "{{ path('download_file', { 'fileId': file.id }) }}"; 
}); 

和你的Symfony控制器可(例如):

/** 
* @Route("/download_file/{fileId}", name="download_file") 
*/ 
public function downloadFileAction($fileId) 
{ 
    $filename = .... 

    $response = new Response(); 
    $response->headers->set('Content-Type', mime_content_type($filename)); 
    $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"'); 
    $response->headers->set('Content-Length', filesize($filename)); 
    $response->headers->set('Pragma', "no-cache"); 
    $response->headers->set('Expires', "0"); 
    $response->headers->set('Content-Transfer-Encoding', "binary"); 

    $response->sendHeaders(); 

    $response->setContent(readfile('LOCATION_OF_FILE/'.$filename)); 

    return $response; 
} 

你的文件將被自動下載到您的用戶將留下在當前頁面上,這是我認爲你所期望的。