Skip to content

1.存储 2 AVFile

jwfing edited this page Jun 20, 2018 · 3 revisions

AVFile 使用说明

文件存储也是数据存储的一种方式,图像、音频、视频、通用文件等等都是数据的载体。很多开发者也习惯把复杂对象序列化之后保存成文件,比如 JSON 或 XML 文件。文件存储在 LeanStorage 中被单独封装成一个 AVFile 来实现文件的上传、下载等操作。

文件上传

文件上传是指开发者调用接口将文件存储在云端,并且返回文件最终的 URL 的操作。

文件上传成功后会在系统表 _File 中生成一条记录,此后该记录无法被再次修改,包括 metaData 字段 中的数据。所以如需更新该文件的记录内容,只能重新上传文件,得到新的 id 和 URL。

从数据流构建文件

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

AVFile file = new AVFile("resume.txt","Working with LeanCloud is great!".getBytes());

上例将文件命名为 resume.txt,这里需要注意两点:

  • 不必担心文件名冲突。每一个上传的文件都有惟一的 ID,所以即使上传多个文件名为 resume.txt 的文件也不会有问题。
  • 给文件添加扩展名非常重要。云端通过扩展名来判断文件类型,以便正确处理文件。所以要将一张 PNG 图片存到 AVFile 中,要确保使用 .png 扩展名。

从本地路径构建文件

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

AVFile file = AVFile.withAbsoluteLocalPath("LeanCloud.png", Environment.getExternalStorageDirectory() + "/LeanCloud.png");

从网络路径构建文件

从一个已知的 URL 构建文件也是很多应用的需求。例如,从网页上拷贝了一个图像的链接,代码如下:

AVFile file = new AVFile("test.gif", "http://ww3.sinaimg.cn/bmiddle/596b0666gw1ed70eavm5tg20bq06m7wi.gif", new HashMap<String, Object>());

从本地路径构建文件 会产生实际上传的流量,并且文件最后是存在云端,而 从网络路径构建文件 的文件实体并不存储在云端,只是会把文件的物理地址作为一个字符串保存在云端。

执行上传

上传的操作调用方法如下:

file.saveInBackground().subscribe(new Observer<AVFile>() {
  public void onSubscribe(Disposable disposable) {
  }
  public void onNext(AVFile avFile) {
    System.out.println("succeed to upload file. objectId=" + avFile.getObjectId());
  }
  public void onError(Throwable throwable) {
    throwable.printStackTrace();
  }
  public void onComplete() {
  }
});

文件下载

客户端 SDK 接口可以下载文件并把它缓存起来,只要文件的 URL 不变,那么一次下载成功之后,就不会再重复下载,目的是为了减少客户端的流量。

文件删除

如果 _File 表打开了 删除权限,该记录才可以被删除。

file.deleteInBackground().subscribe(new Observer<AVNull>() {
  public void onSubscribe(Disposable disposable) {
  }
  public void onNext(AVNull avNull) {
    System.out.println("succeed to delete file");
  }
  public void onError(Throwable throwable) {
    throwable.printStackTrace();
  }
  public void onComplete() {
  }
});

默认情况下,文件的删除权限是关闭的,需要进入 控制台,选择菜单 其他 > 权限设置 > delete 来开启。

文件元数据

AVFilemetaData 属性,可以用来保存和获取该文件对象的元数据信息。metaData 一旦保存到云端就无法再次修改。

AVFile file = AVFile.withAbsoluteLocalPath("test.jpg", Environment.getExternalStorageDirectory() + "/xxx.jpg");
file.addMetaData("width", 100);
file.addMetaData("height", 100);
file.addMetaData("author", "LeanCloud");
file.saveInBackground().blockingSubscribe();

图像缩略图与 CDN 加速

中国节点的文件存储服务自带 CDN 加速访问。 美国节点没有现成的 CDN 加速访问服务,需要用户自行配置。

常见使用场景

很多时候,文件数据都是与一个 AVObject 相关联的,例如用户与头像的关系,这时候我们可以将 AVFile 当做 Pointer 类型关联 AVObject 对象的一个字段:

AVFile file = new AVFile("Satomi_Ishihara.gif", "http://ww3.sinaimg.cn/bmiddle/596b0666gw1ed70eavm5tg20bq06m7wi.gif", new HashMap<String, Object>());
AVObject todo = new AVObject("Todo");
todo.put("girl", file);
todo.put("topic", "明星");
todo.save();

查询的时候需要额外的 include 一下:

AVQuery<AVObject> query = new AVQuery<>("Todo");
query.whereEqualTo("topic", "明星");
query.include("girl");
query.findInBackground().subscribe(ObserverBuilder.buildSingleObserver(new FindCallback<AVObject>() {
    @Override
    public void done(List<AVObject> list, AVException e) {
        list.get(0).getAVFile("girl").getUrl();
    }
}));

至于如何进行查询,请看下一节