Загрузка файла, хотя AJAX POST

Я пытаюсь предоставить простую загрузку с использованием запроса AJAX POST. Пользователь нажимает <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 » в панели инструментов Firebug-подобной панели Google Chrome, и ответ выглядит точно так же, как и файл. Может быть, что-то не так с моими заголовками, но я проверил их дважды уже …

PS 1

Я хотел бы сделать это с помощью AJAX (я предпочитаю его больше, чем создание HTML-формы).

PS 2

У меня много параметров на уровне клиентской стороны (javascript). Мне нужно, чтобы все они были доступны в контроллере (серверный скрипт). При использовании AJAX я просто передаю их в ключ data .

Я не понимаю, почему вы хотите вызвать вызов ajax для загрузки? Почему бы вам просто не сделать обычный <a href="download/me">Download</a> и установить тип mime этой страницы. Таким образом, вы можете запускать любой php-код, а затем эхо-тип mime, это не приведет к перезагрузке страницы, и вы останетесь на странице, где вы нажали кнопку.

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

Вы не загружаете файл с помощью AJAX.

Вам просто нужно <a href="myFile.jpeg"> 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 не будет изменен (я думаю, это то, что вы хотите)

Я не думаю, что его возможно использовать 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> 

И в зависимости от того, как часто это делается, вы должны регулярно очищать загрузку, чтобы не заполнить сервер.