AWS 的 S3 在 php 上的實作

導讀:
AWS - amazon 推出的雲端服務
S3 - AWS的雲端儲存服務
bucket - S3上的容器,可以無限多開但是只能開在根目錄(他沒有所謂目錄概念喔),而每一個bucket 都可以設定要檔案伺服器存在哪個地區,以台灣來說通常放在東京會比較快
object - bucket 上的每一個檔案都是一個 object ,如同上面所提他們沒有資料夾觀念,但是他們可以支援 / 作檔名,因此如果你自己本地端有檔案是 /var/www/html/file/aaa/123.zip 你大可把檔名設定為 file/aaa/123.zip 這樣他也是接受的@@

更多對於 S3 的認識:
這是要錢的服務(好像個人可以有限制的免費~),可以用API把東西丟到雲端伺服器上,然後設定各種權限。
小灰狼這次遇到的狀況就是客戶需要把檔案連結加上一支金鑰,避免只要拿到網址就可以到處亂給人家下載。這個功能的需求還滿普遍的


實作:
1.先註冊服務(這個文件好找~不說)
2.取得 access_key 和 secret_key 這個也找的到作法不說
3.建立一個bucket
3.下載第3方函式庫(為什麼用第3方,當然是原廠的爛阿)
amazon-s3-php-class
第3方函式庫文件

因為文件太完整所以懶的看的人直接往下看常用的實作

A. 把檔案(object)放到容器裡(bucket)
if (!defined('awsAccessKey')) define('awsAccessKey', 'awsAccessKey'); //輸入 awsAccessKey
if (!defined('awsSecretKey')) define('awsSecretKey', 'awsSecretKey');  //輸入 awsSecretKey
$s3 = new S3(awsAccessKey, awsSecretKey);                                          // 宣告初始化 S3 這個 class
   $s3->setEndpoint('s3-ap-northeast-1.amazonaws.com'); // 設定連接的伺服器
   $bucket = 'ebooksjp';                                                         
$s3->putObjectFile($file, "$bucket",$s3_path, S3::ACL_PRIVATE); // 把檔案放上去參數為  '本地端檔案','bucket','上傳後的檔案名稱',權限
第四欄的權限可填可不填,預設是不公開(PRIVATE),如果是要讓所有的人都可以讀也可以輸入S3::ACL_PUBLIC_READ

B.一個在限定時間可以下載的連結
這個實作需要注意到兩件事
a.檔案權限需要是ACL_PRIVATE
b.產生一個限定時間的金鑰
if (!defined('awsAccessKey')) define('awsAccessKey', 'awsAccessKey'); //輸入 awsAccessKey
if (!defined('awsSecretKey')) define('awsSecretKey', 'awsSecretKey');  //輸入 awsSecretKey
$s3 = new S3(awsAccessKey, awsSecretKey);                                          // 宣告初始化 S3 這個 class
   $s3->setEndpoint('s3-ap-northeast-1.amazonaws.com'); // 設定連接的伺服器
   $bucket = 'ebooksjp';                                                         
$s3->putObjectFile($file, "$bucket",$s3_path, S3::ACL_PRIVATE); // 把檔案放上去參數為  '本地端檔案','bucket','上傳後的檔案名稱',權限
echo S3::getAuthenticatedURL_Toky("ebooksjp", $file['s3_path'], 21600); //bucket,上傳後的檔案名稱,金鑰有效時間(秒)
上面這段語法除了最後一行外其他的都跟第一個範例相同,最後印出來的就會是一個完整的下載路徑,雖然網址前面會出現檔案在 S3 上的路徑,但是只要金鑰失效後,就誰也沒有辦法取得內容摟

留言