1

我正在尝试通过 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��;创建者: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������������������������ ������������������������������������������������������ ?�P��q\�O�^�-�C�z�z����o�N��P;��.i�~k+Զ���|�7`'e' ���G�>+���_�6�%�Ԓ��Y�w���P�~.����2E�� ��"��������ms���� [���?��%|"�R5�s�c������=?V��>���IG�=?V��>���I_Q@w����o ���������o����������=?V��>���IG�=?V��>���I_Q@w����o�� ������o����������=?V��>���IG�=?V��>���I_Q@w����o���� �����o����������=?V��>���IG�=?V��>���I_Q@w����o������ ���o����������=?V��>���IG�=?V��>���I_Q@w����o��������o����������=?V��>���IG�=?V��>�� �I_Q@w����o����������o����������=?V��>���IG�=?V��>���I_Q @w����o����������o����������=?V��>���IG�=?V��>���I_Q@w ����o����������o����������=?V��>���IG�=?V��>���I_Q@w�� ��o����������o����������=?V��>���IG�=?V��>���I_Q@w���� o����������o����������=GU��>���� �N�v������%|!E~�xO� �ỹx_P ����j(�z����_

4

2 回答 2

3

你最好的选择是使用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();
}
于 2012-06-09T17:30:01.060 回答
0

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

echo file_get_contents($filename);

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

附录:

我会注意到 jpeg 的正确 MIME 类型是image/jpeg,而不是image/jpg. 这也可能会给您带来问题。

于 2012-06-09T15:46:46.440 回答