我正在开发一个购物系统,shopmanager应该能够将文件上传到系统。这些文件可以收费出售,只能通过提供购买代码才能获得。
整个购买代码和上传工作正常。只需要阻止直接访问该文件。
问题:
我正在运行Apache并使用这样的代码通过表单上传文件:
public function upload_file($file='',$post_value='',$path) {
if ($_FILES[$post_value]) {
$uploadext = strtolower(strrchr($_FILES[$post_value]['name'],"."));
if($uploadext=='.jpg' || $uploadext=='.gif' || $uploadext=='.png' || $uploadext=='.swf' || $uploadext=='.jpeg' || $uploadext=='.pdf' || $uploadext=='.doc' || $uploadext=='.xls' || $uploadext=='.docx') {
$destination = $path.$file.$uploadext;
move_uploaded_file($_FILES[$post_value]['tmp_name'], $destination);
} else {
echo PICTURE_ERROR;
}
}
return $file.$uploadext;
}
答案 0 :(得分:4)
您可以使用move_uploaded_file函数上传任何地方,只需确保网络服务器可以在目标目录中写入。
必须创建一个可以读取文件并将其传递给浏览器的脚本,这样您就可以确保用户已经支付了该文件。
为例
<?php
// insert your logic here to verify the user has access to this file.
// open the file in a binary mode
$name = 'yourfile';
$fp = fopen($name, 'rb');
// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
// dump the picture and stop the script
fpassthru($fp);
exit;
?>
如果使用$ _GET变量来获取文件名,则必须注意内容类型,同时确保用户不能使用服务器的每个文件。
答案 1 :(得分:0)
这实际上非常简单。只需为您的文件创建一个目录,并授予apache权限以写入它。然后,当您调用move_uploaded_file()
函数时,您只需指定该目录的目标。 PHP运行服务器端,因此它可以访问该目录,而使用浏览器的用户将仅限于Apache允许他们访问的内容。
如果您需要下载这些文件,只需创建一个解析URL参数(或其他内容)的脚本,然后从files目录中取出该文件并将其推送到浏览器。
答案 2 :(得分:0)
使用.htaccess
文件或在apache.conf中配置,不允许直接访问上传目录。
<Directory /path/to/upload/dir>
Order Deny,Allow
Deny from All
</Directory>
答案 3 :(得分:0)
在保护文件方面,将文件保存在webroot之外可能是最简单的。当有人想下载它时,您可以使用http_send_file将文件发回给他们。