我通过引用存储文件,这意味着上传的每个文件都被重命名为“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
上传到我的服务器上,并对其进行了更新。
答案 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
中的真实文件名和扩展名。