阿里雲OSS物件儲存URL簽名授權下的PHP服務端和iOS端上傳檔案的設計
阿新 • • 發佈:2018-12-25
阿里雲的OSS物件儲存服務,具有易用,高可靠,高安全,低成本的特性,對於在圖片,音視訊儲存服務的應用非常適用,可以不搭建自己的儲存伺服器.
本來將介紹OSS儲存服務中在服務端進行URL簽名授權,然後移動端進行直傳功能的實現.除此之外還可以使用STS臨時授權,構造授權引數,返回給客戶端,由客戶端自行拼接上傳,此文不再介紹了.
下面直接上乾貨.
PHP服務端程式碼:
const endpoint = 'oss-cn-beijing.aliyuncs.com'; //節點 const accessKeyId = 'LTAIXXXXXXX'; //阿里雲控制檯子賬號key const accessKeySecret = 'p354LPNXXXXXXXXXXX'; //阿里雲控制檯子賬號Secret const bucket = 'ram-XXXX'; //oss控制檯建立的bucket名稱
private static function signedUrl($filepath) { //filepath為bucket下不含bucket名稱為圖片路徑 $bucket = self::getBucketName(); $ossClient =self::getOssClient(); if (is_null($ossClient)) exit(1); $signedUrl = $ossClient->signUrl($bucket, $filepath, 3600,'PUT'); return $signedUrl; } private static function getOssClient() { try { $ossClient = new OssClient(self::accessKeyId, self::accessKeySecret, self::endpoint, false); } catch (OssException $e) { printf(__FUNCTION__ . "creating OssClient instance: FAILED\n"); printf($e->getMessage() . "\n"); return null; } return $ossClient; } private static function getBucketName() { return self::bucket; }
至此就生了簽名url,移動端通過結果獲取該臨時簽名的url檔案,就可進行檔案直傳功能.
接下來上傳客戶端程式碼,以iOS為例,此處引用AFNetworking網路框架,我相信做iOS開發沒有不知道這個框架的.
/** URL簽名下上傳檔案至OSS 指定bucket目錄下 @param data 檔案資料 @param reqUrl 服務端返回的簽名URL @param progressBlock 進度回撥 @param completionBlock 完成回撥 */ - (void)uploadWithData:(NSData *)data OSSUploadUrl:(NSString *)reqUrl progress:(OSSUploadProgressBlock)progressBlock completion:(OSSUploadCompletionBlock)completionBlock{ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:reqUrl]]; request.HTTPMethod = @"PUT"; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSURLSessionUploadTask *task = [manager uploadTaskWithRequest:request fromData:data progress:^(NSProgress * _Nonnull uploadProgress) { progressBlock(uploadProgress); } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { completionBlock(error); }]; self.task = task; [task resume]; }
至此就完成了OSS在服務端簽名,然後在客戶端完成直傳的功能.
不太明白或者需要原始碼的童鞋可以私信或者留言給我.