Я пытаюсь предоставить простую загрузку с использованием запроса 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, это не приведет к перезагрузке страницы, и вы останетесь на странице, где вы нажали кнопку.
Вы не загружаете файл с помощью 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:
Создайте новый файл при загрузке страницы в фоновом режиме. Это будет сохранено в местоположении сервера.
$out = fopen('filename', 'w+'); //write data in file fputcsv($out, some csv values );
иметь ссылку на клиента, чтобы загрузить его
<a href='<?php echo $filename;?>' >Export Data to CSV file</a>
И в зависимости от того, как часто это делается, вы должны регулярно очищать загрузку, чтобы не заполнить сервер.