gpt4 book ai didi

php - 在 php 中,我想将 s3 文件下载到浏览器而不将其存储在我的服务器上

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:14 26 4
gpt4 key购买 nike

我在 Amazon 的 S3 上有文件。它们以唯一 ID 命名,因此没有重复项。我正在使用授权 URL 访问它们。我需要能够将它们传递给浏览器,但我需要重命名它们。现在我正在使用 fopen,但它会先将文件下载到我的服务器,然后再将文件提供给浏览器。如何让文件“通过”我的服务器到达浏览器?或者我如何缓冲下载 - 下载一小块到我的服务器并在下载下一个 block 时将其传递给浏览器?

此外 - 我真的很想使用 CloudFront,但他们不提供经过身份验证的 URL。我相信我可以使用 CURL 发送请求的凭据 - 我可以使用 CURL 执行这种“传递”文件服务吗?

谢谢!

最佳答案

我不熟悉 S3 的工作原理,所以我不知道这个解决方案是否可行。但是您不能简单地将用户的浏览器重定向到该文件吗?如果我理解正确的话,S3 允许您为存储桶中的任何文件创建 Web URL。因此,如果这些是付费下载,那么您可以 have S3 generate a temporary URL for that download然后在用户下载后将其删除。

如果那不是一个选项,您可以尝试这些 PHP 类:

  • HTTP protocol client - 一个实现对 HTTP 资源的请求的类(由下面的流包装器使用)。允许流式传输请求。
  • gHttp - 一个 HTTP 流包装器,可让您使用 fopen()fread() 等函数将远程 HTTP 资源视为文件。
  • Amazon S3 Stream Wrapper - 由与 gHttp 相同的开发人员开发的 Amazon S3 流包装器。还允许通过 fopen('s3://...') 像访问普通文件一样访问远程资源。

编辑:

This page包含有关如何通过在 URL 中编码身份验证 key 来“预身份验证”请求的信息。它位于标题为:查询字符串请求身份验证替代方案的部分下。

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
$sig = utf8_encode($sig);
$sig = hash_hmac('sha1', $sig, $key);
$sig = base64_encode($sig);
return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;

然后只需将用户重定向到 $url,他们就可以下载文件了。签名由单向加密方案 (sha1) 编码,因此您的 AWS secret 访问 key 不存在被泄露的风险。

关于php - 在 php 中,我想将 s3 文件下载到浏览器而不将其存储在我的服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/772505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com