PHP更改文件扩展名并强制下载

时间:2014-02-01 18:03:41

标签: php

我通过引用存储文件,这意味着上传的每个文件都被重命名为“temp_n”,并存储在数据库中,如ID, Name, Originalname, Mime。因此,当我为任何文件滚动下载时,我会转到网址getfile.php?i=$id并根据ID获取该文件。这是我的问题,它没有很好地处理文件,它不会显示/强制下载图像,它应该强制下载任何文件。我会这样强行下载:

$url = "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].dirname($_SERVER['SCRIPT_NAME']);
$dir = '/uploads/messaging/'.$room.'/';
$path = $url.$dir;
header("Content-Type: " . $mime);
readfile($path.$tname);

对于指定的示例,$room为1且是有效文件夹,$path是有效路径。我也尝试过存储扩展程序,然后执行readfile($path.$tname.$ext),其中$ext是.png,但它失败了。我已经搞乱了标题,但是我最大限度地强制它下载getfile.php文件而不是有问题的文件。 PHP代码包含:

<br />
<b>Warning</b>:  readfile(http://url/uploads/messaging/1/upload_IvRWZc) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
 in <b>script/url</b> on line <b>32</b><br />

第32行是相关标题,例如header("Content-Type: application/force-download");header('Content-Type: application/octet-stream');

当前示例显示了一个损坏的图像链接,它知道它是一个图像(基于mime),但它没有显示它。它应该做的只是下载请求的文件。文件夹中没有.htaccess,并且它们正在运行755权限集。

PS。我并没有试图诱骗用户下载垃圾,我正在尝试建立一个安全的文件存储空间,因此没有人将funnyshell.php上传到我的服务器上,并对其进行了更新。

2 个答案:

答案 0 :(得分:1)

根据我对问题的描述得到的一些想法:

  • 你可能不应该传递readfile()一个URL。尝试传递一个有效的文件路径,而不是http://前缀。您可能想要检查当前工作目录的位置(getcwd()),因为这可能与您的执行脚本所在的目录不同,因此提供相对路径可能会失败。
  • 如果要强制浏览器将响应下载为文件,而不是解释响应并在浏览器中显示响应,则应设置附件的内容配置。示例:header('Content-Disposition: attachment; filename="name-of-file.ext"');

答案 1 :(得分:0)

这是解决方案,感谢mwrichardson!我将读取临时文件名,输出真实文件名,但使用getcwd()而不是提供网址。这是代码。

$cwd = getcwd();
$dir = $cwd.'/uploads/messaging/'.$room.'/';
header('Content-Disposition: attachment; filename="'.$rname.'"');
readfile($dir.$tname);

这将提供文件的路径,而不是url,让它访问它。标题将输出存储在数据库examplename.png中的真实文件名和扩展名。