-2

重複の可能性:
ファイルをダウンロードしようとすると、コアphpで無効なファイルが返されます

$filename=gallery/downloads/poster/large/h.jpg  

ファイルをダウンロードするパスは正しいですが、無効なファイルが返される理由がわかりません...

 $filename = $_GET["filename"]; 
 $buffer = file_get_contents($filename);

    /* Force download dialog... */
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Type: image/jpeg');

    /* Don't allow caching... */
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

    /* Set data type, size and filename */
    header("Content-Type: application/octet-stream");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . strlen($buffer));
    header("Content-Disposition: attachment; filename=$filename");

    /* Send our file... */
   echo $buffer;

もっと良い方法があれば、共有してください....よろしくお願いします。

4

1 に答える 1

1

より良い解決策は次のとおりです。

$filename = $_GET["filename"];
// Validate the filename (You so don't want people to be able to download
// EVERYTHING from your site...)

if (!file_exists($filename))
{
    header('HTTP/1.0 404 Not Found');
    die();
}
// A check of filemtime and IMS/304 management would be good here

// Be sure to disable buffer management if needed
while(ob_get_level()) {
   ob_end_clean();
}

// Do not send out full path.
$basename = basename($filename);

Header('Content-Type: application/download');
Header("Content-Disposition: attachment; filename=\"$basename\"");
header('Content-Transfer-Encoding: binary'); // Not really needed
Header('Content-Length: ' . filesize($filename));
Header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

readfile($filename);

とはいえ、「無効なファイル」とはどういう意味ですか? 長さが悪い?長さゼロ?ファイル名が悪い?MIME タイプが間違っていませんか? ファイルの内容が間違っていませんか? 目の下にあるすべてのものを見て、その意味は明らかかもしれませんが、私たちの側からは、それは明らかではありません.

于 2012-09-25T06:15:59.300 に答える