4

webroot 以外のユーザーにファイル (添付ファイル) を送信しようとしています。ヘッダーでファイルを送信し、ストリームで出力する強制ダウンロード スクリプトを作成しました。これは、(この特定のページの) HTML ソースの半分を含むファイルを出力する readfile (ヘッダー設定でもある可能性があります) を呼び出すまではうまく機能します。file_get_contents() を実行したところ、ファイルには適切な文字列「test」が含まれていました。ここで何が問題なのですか?

<?php   
//The path where the files are stored
$file_path = "";
if(isset($_GET['file'])) {
    $file_path = $_GET['file'];
}
else {
    header('HTTP/1.0 404 Not Found');
    die('File not found!');
}

$file_name = basename($_GET['file']);

//Make sure the file exists
if(!file_exists($file_path) && !is_file($file_name)) {
    header('HTTP/1.0 404 Not Found');
    die('File not found!');
}

//Initialize the actual file.
$file = $file_path;

//Notice: Remember to set fifo extension in php.ini
//Windows users must include the bundled php_fileinfo.dll DLL file in php.ini to enable this extension.
$finfo = new finfo(FILEINFO_MIME);
$mime = "";
if(function_exists("finfo_open")) {
    $finfo = finfo_open(FILEINFO_MIME);
    $mime = finfo_file($finfo, $file);  
}
// Provide a default type in case all else fails
else {
    $mime = "application/octet-stream";
}

//Set the appropriate content-type and provide the content-length.
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-type: '.$mime);
header('Content-Disposition: attachment; filename='.$file_name);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.filesize($file));

//Print the image data
readfile($file);
exit;
?>

$file は test.txt と呼ばれ、文字列 "test" が含まれています。Mime/content-type は適切です。

ただし、このスクリプトの出力は html ソースです。

4

1 に答える 1

6

readfileドキュメントから、彼らはreadfile(強制ダウンロードで)前に2つの呼び出しを行います:ob_clean()flush()。私の仮定では、ヘッダーが送信され、クライアントがコンテンツが来ることを理解していることを確認するために、これらを呼び出します。

そこにそれらを追加することをお勧めします、そしてそれはうまくいくはずです。

于 2013-01-10T18:35:16.703 に答える