我正在尝试通过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 _
答案 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
。这也可能会给你带来麻烦。