我的网站上有一个上传文件夹。 我想要做的是限制用户访问,就像我不希望他们去www.mysite.com/uploads/看到那里的文件,它应该显示禁止,但他们应该能够通过我的网站下载,例如www.mysite.com/downloads.php?id=1
如果那不可能,我怎么能在/ uploads上显示目录索引
文件共享网站如何做到这一点?
htaccess with
deny from all
也阻止php访问该文件
请告诉我一个解决方案,如果你知道,我几天前用谷歌搜索并询问了这个问题,这对我来说非常困惑。
答案 0 :(得分:2)
如果要隐藏用户的文件URL,最好将upload folder
移到webroot目录之上。所以没人能从浏览器访问。如何制作download.php
<?php
/*
Step 1. Authorization check
Step 2. get name or id of file that will download $_GET
Step 3. check if its valid (security check)
Step 4. check if that file exist in your upload directory
Step 5. set header using header() function put content-type, attachment etc
Step 6. readfile and output it
*/
?>
答案 1 :(得分:0)
在.htaccess文件中添加此行
Options -Indexes
答案 2 :(得分:0)
将index.htm文件放在uploads文件夹中,或将Options -Indexes
放在.htaccess文件中
答案 3 :(得分:0)
为什么不只为可下载的东西(mkdir publicuploads)创建一个位置,但chmod 700你的上传文件夹? 然后他们可以下载你允许他们下载的内容......
答案 4 :(得分:0)
使用带有deny from all
的.htaccess文件会阻止人们访问该文件夹,它不会阻止php访问它,但是您可以将文件放在比htdocs/www/public_html
文件夹低一个目录并使用php抓住并提供thos文件。
通过传递参数例如:?id=1
,您将使用1
访问$_GET['id']
,您需要检查文件是否存在,添加一些http标头以强制下载。
下面是一个可以解决的简单例子:
<?php
//your below webroot downloads folder
$path="/var/www/somehost.com/downloads/";
//An array created from globing the download directory or from a database source
$files=array('somefile.gif',
'someotherFile.png');
//In my example the id is the key to the file pathe array so 0 would be somefile.gif and 1 would be the next.
if(isset($_GET['id'])){
//Is it numeric?
if(is_numeric($_GET['id']) && isset($files[$_GET['id']])){
//Download the file, the download function will return error on fail, eg: not found or directory
$status = download($path.$files[$_GET['id']]);
//Spit out the error
if(isset($status['error'])){
die($status['error']);
}
}
}
function download($file,$chunk=1024){
if (file_exists($file)) {
if(is_dir($file)){return array('error'=>'Not allowed!');}
//Set content headers to force download.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.str_ireplace(' ','_',basename($file)).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
//If download is larger the 2GB, alls not lost
header('Content-Length: '.sprintf("%u", filesize($file)));
//Clean the buffer
ob_clean();
//Open a handle to the file
$handle = fopen($file, "rb");
$chunksize=(sprintf("%u", filesize($file))/$chunk);
set_time_limit(0);
//Loop through the file
while (!feof($handle)) {
//Echo a piece of the file out
echo fgets($handle, $chunksize);
flush();
}
fclose($handle);
die;
}else{return array('error'=>'Not found!');}
return;
}
?>
您还需要检查文件的用户权限,但这是另一个问题。