2017-01-11 282 views
0

我試圖使用PHP獲取遠程文件(圖像),然後將該圖像放到S3存儲桶中。將PHP file_get_contents流保存到AWS S3

它主要工作,除了上傳到S3的文件再次下載時爲空。

這裏是我到目前爲止的代碼:

$src = "http://images.neventum.com/2016/83/thumb100x100/56f3fb1b9dbd6-acluvaq_63324840.png"; 
$name = md5(uniqid()); 
$ext = pathinfo($src, PATHINFO_EXTENSION); 

$file_content = file_get_contents($src); 
$filename = "{$name}.{$ext}"; 
    try { 
    $file = $this->s3->putObject([ 
     'Bucket' => getEnv('s3bucket'), 
     'Key' => $filename, 
     'Body' => $file_content, 
     'ACL' => 'private' 
    ]); 
    } catch (S3Exception $e) { 
    //Catch 
    } 

希望能對你有所幫助。提前謝謝你。

更新1:

的問題是不是與ACL(我一直在使用「公共」測試),是S3的存儲對象不正確uploded(我認爲是值得做的編碼,但一直沒能弄清楚)

+0

你檢查了$ file_content不是NULL或FALSE嗎?對於file_get_contents()來處理http://你需要在php ini中設置:http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen – at0mzk

+0

是的,我有。事實上,當我使用$ content_type將圖像渲染到客戶端時,它會正確顯示。問題在於文件流何時轉移到S3。 –

+0

@PabloAdoue ::你有沒有試過提供Content-Length? –

回答

0

一旦你上傳圖片到S3存儲桶,它將是私人的,你不能直接下載。您需要提供公共讀取權限才能將對象提供給用戶下載。

+0

問題不在於ACL。它以私有方式上傳到S3,因爲在前端SDK會生成一個簽名鏈接(基於權限)。問題是上載的文件(在S3控制檯上)在下載時爲空。我曾嘗試使用public-read作爲ACL,但並未改變結果。我想這個問題是我試圖上傳遠程文件內容的方式(file_get_content) –

+0

@PabloAdoue然後必須確保圖像在上傳到S3存儲區之前可見。 –

+0

圖像在上傳前可見。如果我通過將內容/類型標頭設置爲「image/png」並回顯$ file_content將內容呈現給客戶端,則圖像正確呈現。一旦我把$ file_content放在S3Object Body上就是問題所在。 –