1

我正在尝试使用 AJAX POST 请求提供简单的下载。用户单击 a<span>并开始下载(或显示下载对话框,具体取决于浏览器)。我已经实现了这一切,但是 AJAX 响应不会触发任何浏览器下载行为,我也不知道为什么。

这是我的代码:

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;

这是示例请求:

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了 Google Chrome 类似萤火虫的工具栏中的选项卡,并且响应看起来与文件完全相同。也许我的标题有问题,但我已经检查了两次......

PS 1

我想使用 AJAX 来制作它(我更喜欢它而不是创建 HTML 表单)。

PS 2

我在客户端层(javascript)中有很多参数。我需要所有这些都在控制器中可用(服务器端脚本)。使用 AJAX 时,我只是将它们传递给data密钥。

4

3 回答 3

4

我不明白你为什么要触发下载的ajax调用?你为什么不做一个常规<a href="download/me">Download</a>并设置该页面的 mime 类型。这样,您可以运行任何 php 代码,然后回显 mime 类型,这不会导致页面重新加载,您将停留在单击的页面中。

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

于 2013-03-11T15:05:19.563 回答
2

您不使用 AJAX 下载文件。

您只需要提供类似的 URL,<a href="myFile.jpeg">但问题是您必须使用标头强制下载并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;
}

在这种情况下.. URL 不会改变(我认为这就是你想要的)

于 2013-03-11T15:06:28.813 回答
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>
    

并且根据执行此操作的频率,您必须定期清理下载,以免填满服务器。

于 2013-05-07T08:16:58.103 回答