阿里云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在服务端签名,然后在客户端完成直传的功能.

不太明白或者需要源码的童鞋可以私信或者留言给我.

猜你喜欢

转载自blog.csdn.net/ling_fengxue/article/details/81704715