8

ユーザーが自分の画像などをダウンロードできる簡単なダウンロードスクリプトを作成しています。

しかし、私は奇妙な問題を抱えています。

ファイルをダウンロードすると、ダウンロードしたファイルタイプに関係なく、index.php ファイルの内容が含まれています。私のコードは次のようになります。

$fullPath = $r['snptFilepath'] . $r['snptFilename'];

if (file_exists($fullPath)) {

    #echo $fullPath;

    // setting headers
    header('Content-Description: File Transfer');
    header('Cache-Control: public'); # needed for IE
    header('Content-Type: '.$r['snptFiletype'].'');
    header('Content-Disposition: attachment; filename='. $filename . '.' . $r['snptExtension']);
    header('Content-Length: '.$r['snptSize'].'');
    readfile($fullPath)or die('error!');
} else {
    die('File does not exist');
}

$r は、ファイルがアップロードされたときにサイズ、タイプ、パスなどを保存したデータベースからの結果です。

アップデート

*.pdf ファイルをアップロードおよびダウンロードすると、正常に動作します。しかし、*.zip と text/rtf, text/plain をダウンロードしようとすると、動作がおかしくなります。

奇妙なことに、ダウンロードしたファイルの内容を含む完全な index.php ファイルをダウンロードします。

答え

これをhttp://php.net/manual/en/function.readfile.phpからコピーしましたが、現在は機能しています。次のようです:ob_clean(); トリックをしました!みんな助けてくれてありがとう。

#setting headers
    header('Content-Description: File Transfer');
    header('Content-Type: '.$type);
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
4

2 に答える 2

11

この関数を試すか、これらのヘッダーをコードに実装してください

    function force_download($filename) {
    $filedata = @file_get_contents($filename);

    // SUCCESS
    if ($filedata)
    {
        // GET A NAME FOR THE FILE
        $basename = basename($filename);

        // THESE HEADERS ARE USED ON ALL BROWSERS
        header("Content-Type: application-x/force-download");
        header("Content-Disposition: attachment; filename=$basename");
        header("Content-length: " . (string)(strlen($filedata)));
        header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
        header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

        // THIS HEADER MUST BE OMITTED FOR IE 6+
        if (FALSE === strpos($_SERVER["HTTP_USER_AGENT"], 'MSIE '))
        {
            header("Cache-Control: no-cache, must-revalidate");
        }

        // THIS IS THE LAST HEADER
        header("Pragma: no-cache");

        // FLUSH THE HEADERS TO THE BROWSER
        flush();

        // CAPTURE THE FILE IN THE OUTPUT BUFFERS - WILL BE FLUSHED AT SCRIPT END
        ob_start();
        echo $filedata;
    }

    // FAILURE
    else
    {
        die("ERROR: UNABLE TO OPEN $filename");
    }
}
于 2012-09-06T09:08:42.473 に答える
8

これをhttp://php.net/manual/en/function.readfile.phpからコピーしたところ、現在は機能しています。ob_clean(); トリックをした..

    #setting headers
    header('Content-Description: File Transfer');
    header('Cache-Control: public');
    header('Content-Type: '.$type);
    header("Content-Transfer-Encoding: binary");
    header('Content-Disposition: attachment; filename='. basename($file));
    header('Content-Length: '.filesize($file));
    ob_clean(); #THIS!
    flush();
    readfile($file);
于 2012-09-06T09:18:44.610 に答える