【问题标题】:file_get_contents over https displays garbage通过 https 的 file_get_contents 显示垃圾
【发布时间】:2012-06-09 15:39:10
【问题描述】:

我正在尝试通过 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����������=?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����_

【问题讨论】:

  • 你说的这些文件的内容究竟是什么?我的意思是,给一个垃圾样本。
  • 我会推荐readfile(...) 而不是file_get_contents(...) 因为file_get_contents(...) 返回一个字符串,而readfile(...) 有效地返回二进制数据,尽管它说它返回typeof(int)
  • (readfile(...))[php.net/manual/en/function.readfile.php] 有一些关于如何执行下载脚本的好信息。只需将application/octet-stream 更改为image/jpeg
  • readfile 的行为方式完全相同,我开始认为这是服务器或 PHP 配置问题
  • @ColeJohnson BINGO!那行得通 - 我使用了代码示例 php.net 并且它有效!谢谢!我无法将您的回复标记为答案,但它对我有用!

标签: php


【解决方案1】:

您最好的选择是使用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();
}

【讨论】:

    【解决方案2】:

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

    echo file_get_contents($filename);
    

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

    附录:

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

    【讨论】:

    • 不幸的是,这并没有什么不同 - sanisitiseData() 用于整个站点的所有数据输入。
    • 我很难相信这没有任何区别,因为'$filename'$filename 完全不同。去掉Content-disposition标头,看看你是不是通过浏览器调用脚本,它只是在屏幕上显示图像吗?]
    • 我之前尝试过这个 - 当我删除两个标题引用时,它会显示上面的垃圾(加上更多,但没有意义全部显示)
    • image/jpeg 是 jpg 图像的正确 mime 类型,而不是 image/jpg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2016-07-08
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多