1)下面是我的代码,用于从Codeigniter中的Amazon S3下载私有文件,$ this-> S3具有我的客户信息(密钥/密钥),当我使用以下代码时,它将文件保存在服务器的根目录中,我想将其保存在用户本地计算机的默认下载位置,因为我不知道特定的最终用户下载位置,有什么帮助解决此问题?
我整天都在研究,找不到特定的解决方案。
$result1 = $this->S3->getObject([
'Bucket' => $bucket,
'Key' => $keyname,
'SaveAs' => $keyname
]);
注意:我不想向最终用户显示我们正在从Amazon服务器下载文件,这就是为什么以下解决方案在Firefox上失败的原因
2)
$cmd = $this->S3->getCommand('GetObject', [
'Bucket' => $bucket,
'Key' => $keyname,
'ResponseContentDisposition' => 'attachment; filename="'.$keyname.'"'
]);
$signed_url = $this->S3->createPresignedRequest($cmd, '+1 minute');
$url=$signed_url->getUri();
header('Location: '.$url);
Screenshot of Firefox save as popup showing source download url
答案 0 :(得分:0)
根据要编写的代码量,有很多解决方法。由于安全性要求高,我最近使用的软件有点复杂。简而言之,它是这样的:
- 使用每个上传/存储的文件的基本数据创建一个表。
这基本上包括上传库在处理文件后输出的所有参数,以及一些其他参数,例如用户组ID(因为每个文件只能由特定的用户组查看),Y / N可用标志和软删除日期。
- 创建一个下载控制器,以处理所有与下载相关的任务
我在其中创建了两个方法,其任务是验证是否确实允许用户访问该特定文件(如果没有,则将其重定向到错误页面) 顺便说一下,该文件位于S3存储桶中,已通过s3fs安装在我的Web服务器上,但这无关紧要。您所需要的与文件实际位置无关。
- 生成非显而易见的下载链接
我的下载链接指向我的下载控制器中的特定方法(downloads / get_file),并传递了一个非显而易见的标识符作为参数,而不是链接到example.com/files/filename.pdf
(这使获取文件变得微不足道)。 IIRC我使用了加密的rawname参数,因此链接看起来像
<a href="mysite.com/downloads/get_file/hdhekfnflsufdifnfbs">get hello.pdf here</a>
- 查找文件,并将其流式传输给用户
转到上面的链接时,get_file方法将rawname作为参数,在表中查找文件(获取本地路径)并将其输出到浏览器。这样,用户将永远不会看到存储在磁盘上的真实路径/ parh甚至真实文件名。