https上的file_get_contents显示垃圾

时间:2012-06-09 15:39:11

标签: php

我正在尝试通过https下载上传的文件,并且在文件本身下载时,无法查看这些文件。

我尝试过JPG,DOC和XLS文件并且都提出了同样的问题,在所有情况下,如果我通过FTP下载它们就会完全打开,并且在浏览器中使用脚本预先下载它们就可以了。

这是脚本的一个子集,显示了我尝试使用的代码?知道为什么要下载垃圾吗?

$_file = sanitiseData($_GET['doc']);
$filename = '/doc_uploads/'.$_file; 
if (file_exists($filename)) { 
header('Content-type:image/jpg');
header('Content-Disposition: attachment; filename="'.$_file.'"');
echo file_get_contents($filename);
} else { 
echo "The file $_file does not exist"; 
} 

以下是尝试通过浏览器查看下载的JPG时的垃圾示例:

JFIF ; CREATOR:gd-jpeg v1.0(使用IJG JPEG v62),质量=90 C C R “ }!1AQa”q2 #B R $3br %&'()* 456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq“2 B #3R br $4 % &'()* 56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?PQ \ o ^ -CzzoNP; .I〜K +Զ| 7` 'e G > + _ 6 % Ԓ Y w P ~. 2E “ ڗȌ 米S [%|“R5sc = V>有?IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q ?@呜= V> IG = V> I_Q @w 600 = V>有IG = V> I_Q @瓦特600 = V>有IG = V> I_Q @瓦特 o o =GU > N v %|!E~ xO ỹx_P j( z _

2 个答案:

答案 0 :(得分:2)

最好的办法是使用readfile(...)。 PHP的网站有一个很好的例子可以帮助你。我在我的网站上使用它,它就像一个魅力:

if (file_exists($file)) {
    // Inform browser that this is a force-download
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    // Inform browser that data can be binary in addition to text
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    // Inform browser that this page expires immediately so that an update to the file will still work.
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    // Push actual file.
    ob_clean();
    flush();
    readfile($file);
    exit();
}

答案 1 :(得分:0)

单引号会导致您输出字符串"$filename"而不是变量值$filename

echo file_get_contents($filename);

虽然我们没有看到函数sanitiseData(),但我们假设它正确地过滤掉了可用于路径注入的字符串,如../

附录:

我会注意到jpeg的正确MIME类型是image/jpeg,而不是image/jpg。这也可能会给你带来麻烦。