1

我正在尝试创建一个链接以使用 symfony2 下载文件。

它确实下载了一个文件,但它在 chrome 中不起作用。我不知道如何使它工作。有人知道该怎么做吗?

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));
4

1 回答 1

1

有一个与所有浏览器兼容的解决方案:不要使用 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; 
}

您的文件将被自动下载,您的用户将停留在当前页面上,我认为这是您所期望的。

于 2014-02-21T11:30:21.493 回答