2010-09-20 62 views
2

我以前在这里发布到文件系统:控制访问与PHP

Controlling Access for Trial Subscription

因为这是基于建议有一个新的问题,我想我应该开始一个新的职位。如果这应该是一个修改,请让我知道未来。

我觉得我有要控制访问的解决方案将是上传文件和散列名称。该文件将在格式:

/uploads/#############.pdf

的链接将被发送到用户。他们第一次来到现场,他们会被要求创建一个“针”和“暗示”要记住。然后可以访问登录页面,通过电子邮件地址/引脚组合列出他们的项目。

我的问题是:我知道我可以控制访问页面,显示他们可以查看的项目,但有没有一种方法来控制/ uploads/[文件]只能下载后,某种程序化检查?我不能再想不出什么办法做到这一点....

感谢。 D.

回答

1

您的PDF文件不必在用户查看目录。他们可以在你的网站根目录之外。这样,没有人可以实际浏览到www.yoursite.ext/uploads/2395wrfhgt.pdf自己下载或与他人分享链接。

为了下载PDF,您将拥有一个专门的脚本,它将对请求它的用户执行所有的访问检查,如果一切正常,它将设置适当的头文件,从文件系统中读取文件,以及打印出来给用户。

所以,让我们说你的网站是在/var/www/site/htdocs/和您上传的每个PDF到/var/www/site/uploads/。你甚至不需要对文件名进行散列处理,而是可以很好地保存它们以方便组织。

然后,所有下载文件的链接将变为指向www.yoursite.ext/download.php?id={fileid}

您的download.php将尽一切访问检查(正常登录,有权限下载文件等),然后请按照以下步骤操作:

$pathToPdf = '/var/www/site/uploads/some.pdf' ; 

header('Content-Type: application/pdf'); 
header('Content-Length: ' . filesize($pathToPdf)); 
header('Content-Disposition: attachment; filename=' . 'some.pdf'); 

readfile($pathToPdf) ; 

而这就好比它。一旦你得到这个工作,就可以考虑提高几件事情:

  • 使用mod_rewrite或类似的有链接,这有助于一些浏览器意识到他们应该下载它的实际文件名PDF:www.yoursite.ext /下载/ {}的fileid .PDF
  • 考虑使用Web服务器,而不是PHP的文件服务解决方案,如X-Sendfile
+0

非常感谢你。这听起来像是一个很好的解决方案。我很感激帮助。 – Don 2010-09-20 21:40:47