从本地计算机上的Amazon S3下载文件,而无需让用户知道codeigniter PHP中的文件源

时间:2018-11-23 13:36:01

标签: php amazon-web-services codeigniter amazon-s3

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

1 个答案:

答案 0 :(得分:0)

根据要编写的代码量,有很多解决方法。由于安全性要求高,我最近使用的软件有点复杂。简而言之,它是这样的:

  
      
  1. 使用每个上传/存储的文件的基本数据创建一个表。
  2.   

这基本上包括上传库在处理文件后输出的所有参数,以及一些其他参数,例如用户组ID(因为每个文件只能由特定的用户组查看),Y / N可用标志和软删除日期。

  
      
  1. 创建一个下载控制器,以处理所有与下载相关的任务
  2.   

我在其中创建了两个方法,其任务是验证是否确实允许用户访问该特定文件(如果没有,则将其重定向到错误页面) 顺便说一下,该文件位于S3存储桶中,已通过s3fs安装在我的Web服务器上,但这无关紧要。您所需要的与文件实际位置无关。

  
      
  1. 生成非显而易见的下载链接
  2.   

我的下载链接指向我的下载控制器中的特定方法(downloads / get_file),并传递了一个非显而易见的标识符作为参数,而不是链接到example.com/files/filename.pdf(这使获取文件变得微不足道)。 IIRC我使用了加密的rawname参数,因此链接看起来像

<a href="mysite.com/downloads/get_file/hdhekfnflsufdifnfbs">get hello.pdf here</a>
  
      
  1. 查找文件,并将其流式传输给用户
  2.   

转到上面的链接时,get_file方法将rawname作为参数,在表中查找文件(获取本地路径)并将其输出到浏览器。这样,用户将永远不会看到存储在磁盘上的真实路径/ parh甚至真实文件名。