![](/img/trans.png)
[英]Can I download file from my Amazon S3 account without using S3 API?
[英]In php, I want to download an s3 file to the browser without storing it on my server
我在Amazon S3上有文件。 它們以唯一的ID命名,因此不會重復。 我正在使用授權的URL訪問它們。 我需要能夠將它們傳遞給瀏覽器,但是我需要重命名它們。 現在,我正在使用fopen,但是它將文件下載到我的服務器上,然后再將文件提供給瀏覽器。 如何使文件“通過”服務器到達瀏覽器? 或如何緩沖下載-將一小塊下載到我的服務器,然后在下載下一塊時傳遞給瀏覽器?
另外-我真的很想使用CloudFront,但是他們不提供經過身份驗證的URL。 我相信我可以使用CURL發送請求的憑據-我可以通過CURL進行這種“傳遞”文件服務嗎?
謝謝!
我不熟悉S3的工作原理,所以我不知道這種解決方案是否可行。 但是您不能簡單地將用戶的瀏覽器重定向到文件嗎? 如果我理解正確,S3允許您為存儲桶中的任何文件創建Web URL。 因此,如果說這些是付費下載,那么您可以讓S3為該下載生成一個臨時URL ,然后在用戶下載后將其刪除。
如果這不是一個選擇,則可以嘗試以下PHP類:
fopen()
, fread()
等函數將遠程HTTP資源視為文件。 fopen('s3://...')
像普通文件一樣訪問遠程資源。 編輯:
該頁面包含有關如何通過在URL中編碼身份驗證密鑰來“預身份驗證”請求的信息。 它在標題為: 查詢字符串請求身份驗證替代的部分下。
// 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秘密訪問密鑰的風險。
您是否嘗試過使用帶有request_options的http_get來指定httpauth和httpauthtype? 盡管我不記得此方法是否假定字符串有效類型,但對於二進制文件可能不起作用。
如果成功,那么您應該能夠提供正確的MIME類型並將其寫出到瀏覽器。
您是否嘗試僅使用readfile(“ http:// username:password@host/filename.ext ”)?
這只會繞過並直接寫入到輸出緩沖區,但是,如果您擔心content-type,則需要先進行驗證。
使用en URL作為readfile的參數還要求PHP使用urlwrapper-support進行編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.