从AWS S3下载文件并在浏览器中使用其他名称下载,在PHP中?

时间:2015-02-18 06:11:31

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

我保存从亚马逊S3的网站上传的文件。我使用唯一的哈希存储文件,以消除重复的可能性。

我可以使用正确的文件名将文件下载到服务器。

如何将文件下载到用户浏览器而不是服务器?我使用Donovan Schonknecht的S3库,我使用S3 :: getObject来读取文件。

其他可能性,是否可以链接像https://s3.amazonaws.com/myfolder/d_b5592038c76db88c4c6113d1fb166fe8e9b1b7b3.pdf这样的网址并将其作为myfile.pdf下载到浏览器?

我不想将文件下载到服务器,然后再下载给用户。

2 个答案:

答案 0 :(得分:0)

感谢您的评论和电子邮件主管...解决方案是使用标头和readfile。我使用了David Walsh的标题示例http://davidwalsh.name/php-force-download并将其与php的readfile结合使用。 readfile使用散列名称读取文件,标题使用其他名称保存。原始文件名或位置永远不会向公众显示。这是一些有用的PHP代码:

// get doc details
$stmt = $conn->prepare("SELECT * FROM docs WHERE docs_hash = :hash LIMIT 1 ");
$stmt->execute(array(':hash' => $docs_hash));
$result = $stmt;

if ($result->rowCount() > 0) {

  foreach($result as $row) {

    $docs_filename    = $row['docs_filename'];
    $docs_extension   = $row['docs_extension'];
    $docs_downloaded  = $row['docs_downloaded'];
    $download_file = "doc_" . $docs_hash . "." . $docs_extension;
  }

  // echo "File 1: $download_file <br>";
  // echo "File 2: $docs_filename <br>";
  // echo "Bucket: " . _AWS_BUCKET_ . "<br>";

  // required for IE
  if (ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off');  }

  // get the file mime type using the file extension
  switch(strtolower(substr(strrchr($docs_filename, '.'), 1))) {
    case 'pdf': $mime = 'application/pdf'; break;
    case 'zip': $mime = 'application/zip'; break;
    case 'jpeg':
    case 'jpg': $mime = 'image/jpg'; break;
    default: $mime = 'application/force-download';
  }
  header('Pragma: public');     // required
  header('Expires: 0');     // no cache
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Cache-Control: private', false);
  header('Content-Type: ' . $mime);
  header('Content-Disposition: attachment; filename="' . basename($docs_filename) . '"');
  header('Content-Transfer-Encoding: binary');
  header('Connection: close');
  readfile("https://s3.amazonaws.com/" . _AWS_BUCKET_ . "/" . $download_file);
  exit();

}

答案 1 :(得分:0)

您可以试用AWS-SDK(官方)。主要思想是从S3服务获取已签名的URL,以便您可以为站点用户提供下载链接,而无需实现服务器端代码。你可以完全使用Javascript。

更多信息: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property