簡體   English   中英

在php中,我想將s3文件下載到瀏覽器而不將其存儲在服務器上

[英]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類:

  • HTTP協議客戶端 -實現對HTTP資源的請求的類(由以下流包裝器使用)。 允許流式傳輸請求。
  • gHttp -HTTP流包裝器,可讓您使用fopen()fread()等函數將遠程HTTP資源視為文件。
  • Amazon S3流包裝器 -由與gHttp相同的開發人員開發的Amazon S3流包裝器。 還允許通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM