在上一篇中我們講了OSS是什麼?為什麼要用?以及怎樣選購和配置。本篇我們主要來看看怎樣使用,我們以Java和PHP兩種語言來示範。
在OSS控制台右側的Bucket管理界面上,我們可以看到官方提供的新手入門和API文檔:

API方式接入OSS
我們就以PHP語言來示範如何通過API的方式接入OSS。首先,在常用入口那兒可以查詢到Access Key,包括一對AccessKey ID和AccessKey Secret。無論是通過API還是SDK方式接入,這兩個參數都是必須的。
其實,檔案上傳到OSS上和檔案上傳到我們自己伺服器上的流程,并沒有多少差別,我們還是會用HTTP協定,通過FORM表單的形式送出資料。不同在于建構這個header頭的參數有些差異罷了。OSS要求我們在header頭中,攜帶一個Authorization參數,用于驗證用戶端身份。是以重點就是圍繞如何建構這個參數,來實作HTTP協定的通信。
既然和我們傳統http的form表單上傳差異在header上,我們不妨就從header入手。首先定義一個數組來放置我們的header參數:
//GMT時間
$date = gmdate('D, d M Y H:i:s T');
//mime
$mime = 'image/png';
//建構報頭
$header = array(
'Host' => 'oss.aliyuncs.com',
'Date' => $date,
'Content-Type' => $mime
);
如上示例定義的header頭中,包含了一個Host用于指定HTTP協定送達的主機域,另外,OSS的API文檔中,要求我們提供一個Date參數來表示時間,格式使用GMT。最後,Content-Type參數來表明我們上傳的檔案格式。為了示範友善,我們這裡寫死為"image/png",表示上傳的是png格式的圖檔。讀者可以根據自身業務邏輯來擷取并傳遞這個MIME。
還記得我們上一篇中建立的Bucket名字麼?這裡就派上用場了,我們得指定檔案往哪上傳,以為OSS中可能不止一個bucket。通常這個資源辨別符是這樣的:
倉庫(bucket)名稱 + 目錄名稱 + 檔案名
假設我們在名為1doc的bucket中有個目錄叫做images,現在要上傳defult.png檔案到這個目錄中,那麼uri就應該是這樣子的:
1doc/images/default.png
我們把這個資源辨別符儲存到一個變量中,待會使用:
$bucketMame = '1doc';
$menu = '/images/';
$fileName = 'default.png';
$savePath = $bucketName . $menu . $fileName;
那麼重點來了,我們要開始準備建構Authorization參數了。
第一步根據API文檔中的指導精神,我們遵循HTTP協定,通過PUT方式來上傳檔案,拼接出請求頭:
$signStr = "PUT\n" . $mime . "n" . $date . "\n" . $savePath;
第二步,通過sha1算法将上面這個待簽名的字元串和AccessKey Secret加密,再用base64編碼:
$signature = base64_encode(hash_mac('sha1', $signStr, $accessKeySecret, true));
第三步,使用AccessKey ID 與上面的簽名字元拼接成最終的Authorization,并加到header頭中:
$sign = 'OSS ' . $accessKeyID . ':' . $signture;
$header['Authorization'] = $sign;
接下來的事兒就簡單了,就是普通的HTTP請求了。當然,我們先準備好要上傳的檔案:
$file = file_get_contents('default.png');
然後通過curl來送出請求:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://oss.aliyuncs.com/' . $savePath);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return $info['http_code'];
對于PHP而言,筆者注意到OSS近來已經支援composer來引入SDK了,相較于早些年自己去加載.php檔案要友善的多。是以,除非沒有更好的解決方案,筆者還是建議使用SDK來內建。
SDK方式接入OSS
我們用java來示範通過sdk的方式接入OSS。筆者的項目使用Maven建構的,在Maven的pom.xml可以很友善地引入OSS SDK依賴:
<!-- 阿裡雲oss元件 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
我們在控制器中定義一個action用來接收用戶端的form表單資料,并上傳到OSS中:
@RestController
public class ResourceController {
@PostMapping("upload.do")
public JsonResult upload(MultipartFile file) {
//具體上傳邏輯
}
}
現在我們來準備一些參數吧,包括AccessKey ID和AccessKey Secret,還有Bucket名字。
String accessKey = "your key";
String accessSecret = "your secret";
String bucketName = "1doc";
String endpoint = "http://oss-cn-shanghai.aliyuncs.com"
相對于API的繁瑣,java的SDK提供了一個OSSClient來幫我們建構請求用戶端,我們稍加封裝成一個方法,以供不同的操作使用:
private OSS getClient() {
return new OSSClientBuilder().build(endpoint, accessKey, accessSecret)
}
我們可以通過這個client去操作OSS檔案的上傳、下載下傳、更新以及删除等操作,不必關系身份驗證等細節問題。
來瞧瞧上傳一個檔案是多麼的簡單:
OSS ossClient = getClient();
ossClient.putObject(bucketName, fileName, inputStream);
ossClient.shutdown();
OSSClient對象中提供的putObject()方法用來上傳檔案,當然putObject有多個重載的方法,以上是以檔案流的方式上傳。
我們在控制器中接收到來自用戶端form表單資料的 MultipartFile,通過getInputStream()方法就可以獲得一個檔案流,在這裡傳入就可以了。
除了putObject()方法,OSSClient對象還提供了諸多的操作OSS檔案的方法,包括常用的增删改查,諸如此類無需再示範。
此緻,祝你OSS用的開心!