-
Notifications
You must be signed in to change notification settings - Fork 27
1.存储 2 AVFile
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 来开启。
AVFile
的 metaData
属性,可以用来保存和获取该文件对象的元数据信息。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 加速访问服务,需要用户自行配置。
很多时候,文件数据都是与一个 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();
}
}));
至于如何进行查询,请看下一节。