6

JPG の強制ダウンロードを可能にする downloadscript を作成したいと考えています。これは私のphpスクリプトです:

<?php
    header("Pragma: public"); // required
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Description: File Transfer");
    header("Content-Type: image/jpg");
    header('Content-Disposition: attachment; filename="'.basename($GET['a']).'"');
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize(($GET['a']));
    readfile(($GET['a']);
?>

これは、私の js コードのコード セグメントです。

function downloadFile(a){
    document.location = "download.php?a="+ a;
}

このコード サンプルでは、​​何も起こりません。結果を HTML タグに追加すると、ファイルの内容が表示されます。

このファイルをダウンロードするようにブラウザに教える方法はありますか?

編集:スクリプトの更新

4

5 に答える 5

21

ajax でファイルをダウンロードすることはできません。したがって、ajax で何かを行う必要がある場合は、応答で url を返し、それを適用してdocument.location = "url"ダウンロード プロセスを開始する必要があります。

ここで一つ注意。私が覚えているように、ユーザーのクリック以外で開始された場合、ブラウザはファイルのダウンロードをブロックします。したがって、これはうまくいきます:

.click(function(){
   document.location = "download url"
})

ただし、ユーザーのクリック以外で開始された場合は、ブロックされます。したがって、次のようなコード:

.click(function(){
       $.ajax({...,
       success:function(download_url_from_server){
           document.location = download_url_from_server;
       }});           
    })

ブラウザによってブロックされます。したがって、投稿でデータを渡したい場合は、フォームを非表示の iframe に送信するか、次を使用して空白のページに送信できます<form target="..."

 function checkToken(token){
    var $form = $("#downloadForm");
    if ($form.length == 0) {
        $form = $("<form>").attr({ "target": "_blank", "id": "downloadForm", "method": "POST", "action": "script.php" }).hide();
        $("body").append($form);
    }
    $form.find("input").remove();
    var args = { a: "checkToken", b: token }
    for (var field in args) {
        $form.append($("<input>").attr({"value":args[field], "name":field}));
    }
    $form.submit();
}

また、script.php では、トークンが OK の場合はすぐに download.php からコードを実行するか、ダウンロード スクリプトにリダイレクトする必要があります。

header("Location: download.php?a=" . $filename)
于 2013-02-08T14:08:33.957 に答える
3

MIME タイプを に設定しても、image/jpegおそらく機能しません。application/octet-streamそのため、代わりにダウンロードを強制する必要があります。

PHP のコンテンツ タイプ ヘッダーを次のように置き換えます。

header('Content-Type: application/octet-stream'); 

また、使用する代わりの良い解決策の 1 つdocument.locationは、iframe を挿入することです。成功のコールバックで次の関数を使用します

function downloadFile(url)
    {
        var iframe;
        iframe = document.getElementById("download-container");
        if (iframe === null)
        {
            iframe = document.createElement('iframe');  
            iframe.id = "download-container";
            iframe.style.visibility = 'hidden';
            document.body.appendChild(iframe);
        }
        iframe.src = url;   
    }
于 2013-02-08T14:12:58.240 に答える
1

スクリプトにエラーがあるようです。まず、GET 変数の正しいスペルは、$GET['a'] ではなく、$_GET['a'] です。ここでの 2 番目の問題は、余分な開き括弧があることです。コードをコピーしたときに、500 Internal Server Error 応答を受け取りました。間違いを正せばうまくいきそうです。コードの修正版を試してみてください。

<?php
    header("Pragma: public"); // required
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Description: File Transfer");
    header("Content-Type: image/jpg");
    header('Content-Disposition: attachment; filename="'.basename($_GET['a']).'"');
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($_GET['a']));
    readfile($_GET['a']);
?>
于 2013-11-02T18:14:01.763 に答える
0

あなたはそれを少し混乱させています。FAngel が指摘したように、AJAX 経由でファイルをダウンロードすることはできません。あなたがする必要があるのは、ユーザーを別のページにリダイレクトし、そのページに上記の PHP コードを含めることです。その PHP コードにより、ユーザーはファイルを直接ダウンロードできるようになります。あなたが試みていることは絶対に可能です.AJAXではなく、別の方向からアプローチする必要があります.

于 2013-02-08T14:15:08.700 に答える