文件存储

注意

1、下载文件到sdcard或者从sdcard上传文件到云端需要在 application 标签下增加如下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2、使用文件存储需导入jar包android-async-http-1.4.9qiniu-android-sdk-7.0.9happy-dns-0.2.7httpclient-4.4.1.1到libs目录下

3、上传下载支持断点续传功能

下载文件

获取文件管理器

ACFileMgr fileMgr = AC.fileMgr();

获取下载url

ACFileInfo fileInfo = new ACFileInfo(bucket, name);
//上传文件时若ACFileInfo中isPublic为true,则expireTime参数无效;默认情况为false,如下24*60*60代表url链接有效时间,即1天
fileMgr.getDownloadUrl(fileInfo, 24 * 60 * 60 ,new PayloadCallback<String>() {
    @Override
    public void success(String url) {
         //成功获取文件url
    }

    @Override
    public void error(ACException e) {
         //没有权限或其他网络错误
    }
});

根据url下载文件

1、下载文件到sdcard

ACUtils.createSDDir("myDir");
File file = null;
try {
     file = ACUtils.createSDFile("myDir/" + name);
} catch (IOException e) {
}
//0代表不校验checksum(除OTA升级外一般情况下不需要检查校验和)
fileMgr.downloadFile(file, url, 0, new ProgressCallback() {
    @Overrides
    public void progress(double progress) {
         //用于显示进度条,百分比,如99.99;如果没有显示进度条的需求则传null
    }
}, new VoidCallback() {
    @Override
    public void success() {
        //下载成功
    }

    @Override
    public void error(ACException e) {
         //支持断点续传,所以此处无网络错误,在恢复网络连接之后会继续下载
    }
});

2、下载文件到内存,比如头像下载

//0代表不校验checksum
fileMgr.downloadFile(url, 0, null, new PayloadCallback<byte[]>() {
    @Override
    public void success(byte[] bytes) {
         //下载成功
    }

    @Override
    public void error(ACException e) {
         //支持断点续传,所以此处无网络错误,在恢复网络连接之后会继续下载
    }
});

上传文件

获取文件管理器

ACFileMgr fileMgr = AC.fileMgr();

设置权限管理

如果对文件的管理有权限管理方面的需求的话,则需要使用到以下接口;如不设置情况下则默认所有用户都有读取权限,只有上传者本人有修改写文件的权限。

//acl为权限管理
ACACL acl = new ACACL();
//设置所有人可读,黑名单除外(或者设置所有人不可读,白名单除外)
acl.setPublicReadAccess(true);
//设置所有人可写,黑名单除外(或者设置所有人不可写,白名单除外)
acl.setPublicWriteAccess(true);
//设置黑名单,userId为1的用户没有读的权限
acl.setUserDeny(ACACL.OpType.READ, 1);
//设置白名单,userId为1的用户有写的权限
acl.setUserAccess(ACACL.OpType.WRITE, 1);

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

上传文件

1、上传sdcard文件

//bucket可理解为文件存储在云端的目录,name为文件名。(开发者自己维护通过这两个参数保证上传的所有文件在云端不会重名,建议通过UUID的方式命名文件或者以用户/设备唯一标识命名bucket),重目录重名的情况下原文件会被覆盖。另外可通过这两个参数获取到下载的url。
ACFileInfo fileInfo = new ACFileInfo(bucket, name);
//设置acl权限,可选
fileInfo.setACL(acl);
//设置上传文件的sdcard路径
fileInfo.setFile(new File(Environment.getExternalStorageDirectory() + "/myDir/" + name));
fileMgr.uploadFile(fileInfo, new ProgressCallback() {
    @Override
    public void progress(double progress) {
         //用于显示进度条,百分比,如99.99;如果没有显示进度条的需求则传null
    }
}, new VoidCallback() {
    @Override
    public void success() {
         //上传成功
    }

    @Override
    public void error(ACException e) {
         //支持断点续传,所以此处无网络错误,在恢复网络连接之后会继续上传
    }
});

2、上传小文件,比如头像

//bucket可理解为文件存储在云端的目录,name为文件名。(开发者自己维护通过这两个参数保证上传的所有文件在云端不会重名,建议通过UUID的方式命名文件或者以用户/设备唯一标识命名bucket),重目录重名的情况下原文件会被覆盖。另外可通过这两个参数获取到下载的url。
ACFileInfo fileInfo = new ACFileInfo(bucket, name);
//设置acl权限,可选
fileInfo.setACL(acl);
//比如头像比特流数组
fileInfo.setData(bytes);
fileMgr.uploadFile(fileInfo, null, new VoidCallback() {
    @Override
    public void success() {
        //上传成功
    }

    @Override
    public void error(ACException e) {
        //支持断点续传,所以此处无网络错误,在恢复网络连接之后会继续上传
    }
});