1

AJAXPOSTリクエストを使用して簡単なダウンロードを提供しようとしています。ユーザーがをクリックする<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

Google ChromeのFirebugに似たツールバーのタブを確認しましNetworkたが、応答はファイルとまったく同じように見えます。ヘッダーに問題があるかもしれませんが、すでに2回チェックしました...

PS 1

AJAXを使って作りたいです(HTMLフォームを作成するよりも好きです)。

PS 2

クライアントサイドレイヤー(javascript)にたくさんのパラメーターがあります。それらすべてをコントローラー(サーバー側スクリプト)で使用できるようにする必要があります。dataAJAXを使用するときは、キーに渡すだけです。

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 に答える