2013-07-27 2 views
1

symfony2를 사용하여 파일을 다운로드하는 링크를 만들려고합니다.symfony2 Ajax에서 강제로 다운로드하는 방법 json 데이터 유형을 반환하십시오.

파일을 다운로드하지만 Chrome에서 작동하지 않습니다. 어떻게 작동시키는 지 모르겠습니다. 아무도 어떻게해야하는지 알지 못합니까? 컨트롤러

$.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 코드 :

JQuery와 코드

$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를 사용하지 마십시오.

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

을 그리고 당신의 심포니 컨트롤러 (예를 들어) 수 : 대신과 같이 간단한 "같이 location.href"명령을 쓰기

/** 
* @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; 
} 
귀하의 파일이 자동으로 다운로드되며, 사용자는 남아있을 것입니다

현재 페이지에서, 나는 당신이 기대하는 바를 생각합니다.

관련 문제