1. 程式人生 > >阿里雲OSS物件儲存URL簽名授權下的PHP服務端和iOS端上傳檔案的設計

阿里雲OSS物件儲存URL簽名授權下的PHP服務端和iOS端上傳檔案的設計

阿里雲的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在服務端簽名,然後在客戶端完成直傳的功能.

不太明白或者需要原始碼的童鞋可以私信或者留言給我.