文件存储

SDK中针对常见的文件/图片的上传下载, 已经用户头像的处理等情况, 提供了文件管理器. 文件的上传指的是开发者调用接口将文件存储在云端,并且返回文件最终的 URL 的操作. 文件管理需要使用ACFileInfo类和ACFileManager类, 所以需要在项目相关的类的头部添加如下代码:

#import "ACFileInfo.h"
#import "ACFileManager.h"

文件上传

. 从数据流构建文件

ACFileInfo支持图片、视频、音乐等常见的文件类型,以及其他任何二进制数据,在构建的时候,传入对应的数据流即可:

    NSData *data = [@"我的工作经历" dataUsingEncoding:NSUTF8StringEncoding];
    ACFileInfo *fileInfo = [[ACFileInfo alloc] initWithName:@"resume.txt" bucket:@"bucketName"];
    fileInfo.data = data;

相关注意事项如下:

  1. 文件名称云端存储有可能会冲突, 建议开发者在命名的时候将用户的Id作为命名的一部分, 例如resume.txt则命名为: 当前用户UID + resume.txt
  2. 给文件添加扩展名非常重要。云端通过扩展名来判断文件类型,以便正确处理文件。所以要将一张 PNG 图片存到 ACFileInfo 中,要确保使用 .png 扩展名。
  3. 数据流构件文件适用于文件大小相对较小的情况, 例如配置文件, 图片等情况, 如果需要上传视频流等大型文件, 请使用从本地路径构件文件
  4. bucket字段为数据存储对应的文件夹, 例如可将所有的头像上传至headerImage文件夹, 将所有的数据上传至data文件夹, 文件夹名字直接填写, 无需去控制台创建

. 从本地路径构建文件

大多数的客户端应用程序都会跟本地文件系统产生交互,常用的操作就是读取本地文件,如下代码可以实现使用本地文件路径构建一个ACFileInfo:

    NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *aviPath = [documentsDirectory stringByAppendingPathComponent:@"ablecloud.avi"];
    ACFileInfo *fileInfo = [[ACFileInfo alloc] initWithName:@"aviName" bucket:@"bucket"];
    fileInfo.filePath = aviPath;

相关注意事项如下:

  1. 文件名称云端存储有可能会冲突, 建议开发者在命名的时候将用户的Id作为命名的一部分, 例如resume.txt则命名为: 当前用户UID + aviName
  2. 给文件添加扩展名非常重要。云端通过扩展名来判断文件类型,以便正确处理文件。所以要将一段 avi 视频存到 ACFileInfo 中,要确保使用 .avi 扩展名.
  3. 调用上传方法之前, 请确认对应的路径能够正确的取到对应的文件.
  4. bucket字段为数据存储对应的文件夹, 例如可将所有的头像上传至headerImage文件夹, 将所有的数据上传至data文件夹, 文件夹名字直接填写, 无需去控制台创建

. 执行上传操作

  • 上传前可对上传文件的权限进行设置如下:
ACACL *acl = [[ACACL alloc] init];
//设置`全局可读`访问权限,不设置则默认为所有人可读
[acl setPublicReadAccess:YES];
//设置`全局可写`访问权限,不设置则默认为除自己外的所有人不可写
[acl setPublicWriteAccess:YES];
//设置黑名单,userId为1的用户没有读的权限
[acl setUserDeny:ACACLOpTypeREAD userId:1];
//设置白名单,userId为1的用户有写的权限
[acl setUserAccess:ACACLOpTypeWRITE userId:1];
//设置acl权限,可选
[fileInfo setAcl:acl];

规则优先判断黑名单,黑名单命中后其他设置无效,其次判断白名单,最后判断全局设置属性。例如同时设置userId为1的用户为黑名单和白名单,则设置的白名单无效。

  • 上传的操作调用方法如下:
    ACFileManager *manager = [[ACFileManager alloc] init];
    [manager uploadFileWithfileInfo:fileInfo progressCallback:^(float progress) {
        //进度回调...
    } voidCallback:^(ACMsg *responseObject, NSError *error) {
        //TODO..
    }];

文件下载

SDK提供文件下载的功能, 下载操作分为两步: 获取文件URL下载文件

. 获取文件URL

要下载对应的文件, 应先到云端获取对应的文件下载URL地址, 使用bucketname字段匹配对应的文件:

    ACFileInfo *fileInfo = [[ACFileInfo alloc] initWithName:@"name" bucket:@"bucket"];
    ACFileManager *manager = [[ACFileManager alloc] init];
    [manager getDownloadUrlWithfile:fileInfo ExpireTime:0 payloadCallback:^(NSString *urlString, NSError *error) {
        //TODO...
    }];

相关注意事项:

  1. URL的搜索是根据namebucket来决定的, 所以开发者在上传对应的文件的时候要记得你上传的路径名称, 即bucket/name
  2. ExpireTime字段取值取决于你上传的存储空间是 public/private, 如果上传的是 public空间, 则该字段无效; 如果上传的是private空间, 则该字段为下载链接的有效期, 有效期的使用场景可能是: 你分享某一个文件的下载权限给好友, 一段时间后自动失效等.

. 下载文件

获取到文件的下载URL后, 即可调用下载的方法进行文件下载:

    [manager downFileWithsession:@"urlString" checkSum:0 callBack:^(float progress, NSError *error) {
        //进度回调...
    } CompleteCallback:^(NSString *filePath) {
        //TODO...
    }];

相关注意事项:

  1. checkSum字段仅为进行OTA升级的时候使用, 其他类型的文件下载不需要关心, 填写0(零)即可.
  2. 文件下载是基于NSURLSession进行的, 支持断线续传功能.
  3. 下载到的文件在对应的沙盒里面.
  4. 如果是下载头像等图片资源, 建议使用SDWebImage等第三方库下载