我正在研究文件存储,我的设计是显示数据库中有关文件的数据以及一个带有a href
标签的按钮来下载我的文件。当我将存储保存在我的网站根目录中时,我成功地完成了所有这些工作 - 但根据建议,我进行了更改。
我现在在我的 C:/驱动器中有我的项目根目录,但我的存储我想在根之外,但由于安全性,根据建议,我将我的存储保存在我的 d:/驱动器中 - 以及我的 d:/驱动器无论如何都是我的云存储。从我在网上看到的情况来看,这意味着我不能再使用<a href="d:/storage/Username/file download>
来下载我的文件了!
如果这是真的,你如何从你的网站根目录之外下载?
如果没有,我如何通过使用 href 方法在根目录之外下载的安全限制?
谢谢!
你可以使用 readfile((
要么链接到下载器.php?f=somefile.jpg 使用重写规则。
在下载器中.php执行以下操作
<?php
$path = 'D:/map/';
if( login_check($user) && is_file($path . $_GET['f']) ) {
header('Content-Type: image/jpeg');
readfile($path . $_GET['f']);
}
?>
我添加了 login_check((,因为您提到了有关安全性的内容。 此外,建议检查参数中的非法字符(尤其是斜杠( 内容类型可能因所选文件而异
让它工作,感谢伊沃 P 的开始。
我首先发送下载.php我的文件名、文件扩展名和文件路径都用 * 分隔(* 不是允许的文件名(。一个例子是:
download.php?f=myTextFile*txt*d:/storage/test/myTextFile.txt
然后,我将 $_GET['f'] 分解为 *,确保数组大小为 3,然后设置内容标头:
$file_info = explode("*", $_GET['f'], 3);
if(is_file($file_info[2]) && count($file_info) == 3) {
header('Content-Description: File Transfer');
header("Content-Type: " . mime_content_type($file_info[2]));
header('Content-Disposition: attachment; filename="'.$file_info[0] . '.' .$file_info[1].'"');
header('Expires: 0');
header('Pragma: public');
readfile($file_info[2]);
}
这对我来说是可行的解决方案!在 txt、jpg 和 exe 上测试过 - 运行良好。我为我的项目测试提供了其他个性化设置,以确保"f"有效(因此用户不能通过转到地址栏并弄乱事情来搞砸它,请参阅real_escape_string(,但这就是它的要点!
感谢Bjorn进行编辑:请记住,这允许完全访问服务器,确保您个性化自己的下载.php接受遵循自己格式的输入(否则任何人都可以窃取您的php文件,js文件等!