我允许用户将文档上传到服务器。但是,我不希望他们明显看到文件的存储位置。我能做什么才能让他们仍然获取文件但却看不到文件位置。
答案 0 :(得分:3)
您可以使用PHP查询来完成此操作,假设您使用以下URL:
http://mysite.com/files.php?file=xyz.pdf
在files.php中,您可以检查获取变量文件并使用硬编码函数来检索文件。您可以通过使用标头强制下载或将文件读入var并将其内容打印到页面来实现这一目的。比如像读取文件并将其打印到页面的pdf与将其链接到文件相同。
但是警告:与使用标题一样,除了文件之外,不会向页面打印任何内容。如果您阅读文件并打印它,我还建议您仍然声明标题,以便最终用户不会获得作为文件来源的gobbly goop,即jpg或pdf。
哦不,我忘了标题警告,自从Adobe为PDF的开源制作ISO以来,我一直遇到标题问题,具体取决于生成PDF的应用程序和用户上传PDF的浏览器来自,标题将来自:
'application/pdf', 'application/x-download','application/octet-stream','application/octet','binary/octet-stream'
所以要小心将上传部分硬编码为标题类型,我知道这个问题是关于下载但我只是想我会把它扔在那里。使用标题进行下载并不重要,我只需使用标准的application / pdf。
答案 1 :(得分:2)
有一些方法可以解决这个问题,但我更喜欢使用.htaccess
所以我的链接看起来像http://example.com/files/filename.zip
url中的额外参数可以使用用户名或密码,如:
http://example.com/files/bob/filename.zip
http://example.com/files/18d52c/filename.zip
然后可以针对数据库检查thos以查看是否允许用户下载该特定文件,就像您在付款后用于即时下载一样..但基本方法是这样的:
<强>的.htaccess 强>
RewriteRule ^files/(.*)$ serve.php?file=$1
<强> serve.php 强>
<?php
if(isset($_GET['file'])){
$file=basename($_GET['file']);
//Protect the index.php && serve.php
if(basename($_GET['file'])=='index.php' || basename($_GET['file'])=='serve.php'){
header("HTTP/1.1 403 Forbidden");die();
}
$downloadFolder="original_location/";
if(file_exists($downloadFolder.$file)){
$fsize = filesize($downloadFolder.$file);
$ctype=finfo_file(finfo_open(FILEINFO_MIME_TYPE), $downloadFolder.$file);
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
header("Content-Type: application/force-download");
header('Content-Description: File Transfer');
}else{
header("Content-Type: $ctype");
}
header("Content-Disposition: attachment; filename=\"".basename($file)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile('original_location/'.$file);
}else{
header("HTTP/1.0 404 Not Found");
}
die();
}
header("HTTP/1.0 404 Not Found");
?>
<强> original_location / index.php的强>
header("HTTP/1.1 403 Forbidden");
答案 2 :(得分:1)
使用您可以映射到真实文件的随机唯一ID来存储它,然后使用在实际文件上执行readfile()
的脚本来提供它。
http://php.net/readfile文档也有一个关于如何强制下载的示例。