【问题标题】:How do you force a file to download from Amazon S3 using the Amazon SDK for PHP?如何使用 Amazon SDK for PHP 强制从 Amazon S3 下载文件?
【发布时间】:2012-05-23 23:36:05
【问题描述】:

我有一个使用 Amazon S3 存储文件的应用程序。我遇到了一个问题,即没有使用 chrome 下载大型 PDF。较小的 PDF 效果很好,但较大的 PDF 将不起作用。我不认为这是 PDF 的问题,我怀疑它与文件的大小有关。

在浏览器中查看文件时,这是我正在使用的代码:

header("Content-type: $filetype");
header("Content-Disposition: filename=\"".$filename."\"");
$response = $s3->get_object(AMAZON_BUCKET, $filepath);   
echo $response->body;

这对较小的文件非常有用,但今天我遇到了一个问题,即无法显示这个大 PDF。我认为文件太大而无法呈现。因此,如果文件太大,我决定尝试强制下载文件而不是在浏览器中查看。所以这是我试图开始工作的代码,但我一定做错了什么,因为它不起作用。

    $response = $s3->get_object(AMAZON_BUCKET, $filepath, array(
      'response' => array(
        'content-type' => $filetype,
        'content-disposition' => 'attachment'
       )
    ));

如何使用 Amazon SDK for PHP 强制下载文件?

【问题讨论】:

  • 如果文件太大,可能是您的 PHP 脚本内存不足。您是否检查了错误日志(或启用了显示错误?您是否得到“响应”?更多关于它在哪里中断的线索可能会有所帮助。
  • 我将内存增加到 82M。我遇到问题的文件是 43 mb。
  • 问题的另一部分:你能描述更多它不起作用的症状吗?您是否从服务器得到任何响应 - 500 错误、“警告”或“通知”。日志中有任何内容吗?
  • 挂了一会儿,然后给我一个找不到这个网页。但真的在那里....不知道为什么会发生这个错误。我尝试的另一件事是获取对象的 URL,然后直接转到它,但我得到的只是一个空白页面。有趣的是,如果我在 safari 中使用相同的 URL,它可以工作,只是不是 chrome。
  • 如果我禁用 chrome 在浏览器“about:plugins”中查看 PDF,然后让它转到 Amazon 提供的 URL,那么它将在 chrome 中工作。 Chrome 默认会在浏览器中查看 PDF,因此我不能依赖禁用插件的人来下载文件。

标签: php google-chrome pdf amazon-s3 amazon-web-services


【解决方案1】:

您的方法的问题是您将整个文件从 S3 下载到网络服务器的内存,然后将其发送到用户的浏览器。如果文件很大,这可能会导致超过memory_limit 甚至max_execution_time。 (诚​​然,我不知道为什么您的案例是特定于 Chrome 的..)

更优雅的方法是重定向用户直接从 S3 下载文件。您甚至可以set custom headers 成为您请求的一部分,因此您可以强制下载对话框。使用get_object_url() 而不是get_object()

【讨论】:

  • 感谢您的建议。我想我会重新考虑我这样做的方式。但有趣的问题是,当我从 get_object_url 获取从亚马逊返回的 url 并将该 url 放入 chrome 时,它​​会被浏览器取消。如果我在 safari 中做同样的事情,它将下载文件。你知道为什么 chrome 不会下载它而 safari 会吗?
  • 我添加了标题,它解决了 chrome 的问题。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2012-10-10
  • 2012-08-29
相关资源
最近更新 更多