Android客户端实现七牛云存储文件上传
1.简单文件上传 上传模型如下。
1.1获得Token
不管是简单文件上传,还是分片上传、断点续传 都需要首先访问服务器,以获得上传凭证信息Token.。用于测试时,可以用本地模拟Token信息(有安全隐患,容易造成数据和空间数据危险)本地模拟Token信息 1.2《本地模拟Token》
1.1.1本地模拟Token.
/**
* 获取token 本地生成
*
* @return
*/
private String getToken() {
Mac mac = new Mac(QiNiuConfig.QINIU_AK, QiNiuConfig.QINIU_SK);
PutPolicy putPolicy = new PutPolicy(QiNiuConfig.QINIU_BUCKNAME);
putPolicy.returnBody = "{\"name\": $(fname),\"size\": \"$(fsize)\",\"w\": \"$(imageInfo.width)\",\"h\": \"$(imageInfo.height)\",\"key\":$(etag)}";
try {
String uptoken = putPolicy.token(mac);
System.out.println("debug:uptoken = " + uptoken);
return uptoken;
} catch (AuthException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
1.2简单文件实现上传(参考七牛官方文档)
小于4M,采用简单文件上传模式。从回调中获得上传最后信息,是失败或者是成功。
data = <File对象、或 文件路径、或 字节数组>
String key = <指定七牛服务上的文件名,或 null>;
String token = <从服务端SDK获取>;
UploadManager uploadManager = new UploadManager();
uploadManager.put(data, key, token,
new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject response) {
Log.i("qiniu", info);
}
}, null);
回调参数说明:
参数 | 说明 |
key | 即uploadManager.put(file, key, …)方法指定的key。key 指定存储在云服务器上的文件名字。并会通过返回值返回出来。 |
info | http请求的状态信息等,可记入日志。isOK()返回 true表示上传成功。 |
response | 七牛反馈的信息。可从中解析保存在七牛服务的key等信息,具体字段取决于上传策略的设置。 |
1.2.1 记录上传进度 (参考七牛官方文档)
用与进度显示。更新UI进度操作。
uploadManager.put(data, key, token,handler,
new UploadOptions(null, null, false,
new UpProgressHandler(){
public void progress(String key, double percent){
Log.i("qiniu", key + ": " + percent);
}
}, null));
注:progress(key, percent)中的key 即uploadManager.put(file, key, …)方法指定的key
1.2.2取消上传
设置标志位,可以取消上传操作。直接覆盖uploadManager,最后一个上传参数。
private volatile boolean isCancelled;
...
// 某方法中执行取消:isCancelled = true;
...
uploadManager.put(data, key, token,handler,
new UploadOptions(null, null, false, progressHandler,
new UpCancellationSignal(){
public boolean isCancelled(){
return isCancelled;
}
}));
1.2.3记录断点
分片上传中,可将各个已上传的块记录下来,再次上传时,已上传的部分不用再次上传。 断点记录类需实现 com.qiniu.android.storage.Recorder 接口。已提供保存到文件的 FileRecorder 实现。
String dirPath = <断点记录文件保存的文件夹位置>
FileRecorder fr = new FileRecorder(dirPath)
UploadManager uploadManager = new UploadManager(fr);
uploadManager.put(data, key, ...) //默认使用 key 的url_safe_base64编码字符串作为断点记录文件的文件名。避免记录文件冲突(特别是key指定为null时),也可自定义文件名: UploadManager uploadManager = new UploadManager(fr, new KeyGenerator(){
public String gen(String key, File file){
// 不必使用url_safe_base64转换,uploadManager内部会处理
// 该返回值可替换为基于key、文件内容、上下文的其它信息生成的文件名
return key + file.getName();
}
});
2.分片文件上传(官方文档解释)
2.1官方相关概念
2.2分片上传相关代码例子 (Demo这里)
得到要上传的文件信息转化为Upload对象。
private void preUpload(Uri uri) {
// 此参数会传递到回调
String passObject = "test: " + uri.getEncodedPath() + "passObject"; String qiniuKey = UUID.randomUUID().toString();
PutExtra extra = null; Upload up = UpApi.build(getAuthorizer(), qiniuKey, uri, this, extra, passObject, uploadHandler);
addUp(up);
}
执行上传操作,UpApi.execuete(up)会根据文件大小,执行分块上传文件操作。
private synchronized void doUpload() {
System.out.println("doup: 启动上传任务");
for (Upload up : ups) {
if (UpApi.isSliceUpload(up)) {
String sourceId = generateSourceId(up.getUpParam(), up.getPassParam());
List<Block> bls = null;
try {
bls = load(sourceId);
} catch (IOException e) {
e.printStackTrace();
}
// 设置以前上传的断点记录。 直传会忽略此参数
up.setLastUploadBlocks(bls);
}
// UpApi.execute(up, bls);
Executor executor = UpApi.execute(up);
executors.add(executor);
}
System.out.println("doup: 启动上传任务完毕");
start = System.currentTimeMillis();
}
3断点续传
参考Demo:这里:
相关代码:
public void doResumableUpload(final Uri uri, PutExtra extra) {
uploadUri = uri;
final MyBlockRecord record = MyBlockRecord.genFromUri(this, uri); tvUploadInfo.setText("连接中");
String key = null;
if (extra != null) {
extra.params = new HashMap<String, String>();
extra.params.put("x:a", "bb");
}
List<Block> blks = record.loadBlocks();
String s = "blks.size(): " + blks.size() + " ==> ";
for (Block blk : blks) {
s += blk.getIdx() + ", ";
}
final String pre = s + "\r\n";
uploading = true;
executor = ResumableIO.putFile(this, auth, key, uri, extra, blks, new CallBack() {
@Override
public void onSuccess(UploadCallRet ret) {
uploading = false;
String key = ret.getKey();
String redirect = "http://" + MyActivity.bucketName + ".qiniudn.com/" + key;
String redirect2 = "http://" + MyActivity.bucketName + ".u.qiniudn.com/" + key;
tvUploadInfo.setText(pre + "上传成功! ret: " + ret.toString() + " \r\n可到" + redirect + " 或 " + redirect2 + " 访问");
record.removeBlocks();
clean();
} @Override
public void onProcess(long current, long total) {
int percent = (int) (current * 100 / total);
tvUploadInfo.setText(pre + "上传中: " + current + "/" + total + " " + current / 1024 + "K/" + total / 1024 + "K; "
+ percent + "%");
// int i = 3/0;
progressBar.setProgress((int) percent);
} @Override
public void onBlockSuccess(Block blk) {
record.saveBlock(blk);
} @Override
public void onFailure(CallRet ret) {
uploading = false;
clean();
tvUploadInfo.setText(pre + "错误: " + ret.toString());
}
});
}
Android客户端实现七牛云存储文件上传的更多相关文章
- 七牛云覆盖上传 php
使用七牛云过程中遇到了需要上传覆盖的情况,最终解决,分享给大家. 七牛云sdk上传示例中是这样写的 <?php require_once 'path_to_sdk/vendor/autoload ...
- angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
step1:引入文件 引入Plupload *该SDK上传功能集于Plupload插件封装,所以需要下载Plupload; plupload.dev.js 引入qiniu.js为了简便,当时直接从官网 ...
- 图床工具PicGO实现七牛云图片上传
图床工具PicGO实现七牛云图片上传 我们在写博客或者网络文章时经常需要上传图片.目前最有名气的图床工具就是PicGO. 简单的界面,完整的功能,在相册里也能直接复制markdown图片链接.一直深受 ...
- laravel 7七牛云文件上传
1:composer下载七牛云 composer require itbdw/laravel-storage-qiniu 2:打开 config 文件夹下的 app.php 文件,在 provider ...
- tp 七牛云文件上传
1.先创建好七牛云账号和存储空间 申请七牛云账号: 创建七牛云存储空间: 在账号的秘钥管理里面创建秘钥 获取AccessKey / SecretKey: 2.集成PHP-SDK 七牛云开发文档:htt ...
- 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法
一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...
- tp5.0整合七牛云图片上传
转:https://www.cnblogs.com/adobe-lin/p/7699638.html 这里以上传图片为例 上传其他文件也是大同小异 使用composer安装gmars/tp5-qini ...
- 七牛云存储上传自有证书开启https访问
虽然七牛云存储也提供免费SSL证书申请,但我就喜欢用其他平台申请的,于是在腾讯云申请了免费SSL证书,正准备在七牛上传,弹出的界面却让我傻了眼,如下图所示: 腾讯免费SSL证书提供了不同服务器环境的版 ...
- C#使用七牛云存储上传下载文件、自定义回调
项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现. 做了一个简易的压力测试,同时上传多个文件,七牛自己应该有队列处理并发请求,我无论同时提交多少个文件,七牛是批量一个个排队处理了. 一个 ...
随机推荐
- 解决git提交问题error: The requested URL returned error: 403 Forbidden while accessing
git提交代码时,出现这个错误"error: The requested URL returned error: 403 Forbidden while accessing https&qu ...
- Java发送邮件的简单实现
使用Oracle官方的JavaMail进行实现,JavaMail下载地址:https://java.net/projects/javamail/pages/Home 将下载好的jar包加入到工程路径中 ...
- Android SwitchButton(滑动开关)
@RemoteView public class Button extends TextView { public Button(Context context) { this(context, nu ...
- make文件中静态连接库在command里面的位置
linux软件第一次调用动态连接库的时候要延迟几秒,怀疑在突然掉库的时候动态库加载耗费了时间,所以造成延时,遂改为静态库方式,原来的makefile文件是 testmac: cp $( ...
- 【移动开发】Android中WIFI开发总结(一)
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热 ...
- OpenStack对象存储——Swift
OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性.本文将从架构.原理 和实践等几方面讲述S ...
- ListIterator add remove 使用注意
add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[] ...
- HUD 2846 Repository
/* 开始想耍小聪明 直接map搞 代码短 好理解 空间够 恩 很好 就是 map慢死了 T了 */ #include<iostream> #include<cstdio> # ...
- Java Criteria表关联查询(两个表未定义关联关系)
Criteria criteria = this.getSession().createCriteria(Competition.class, "b"); DetachedCrit ...
- vmware-tools(vmware workstation 10.0.4)安装的时候遇到的bug
有个GitHub,专门解决C++编译的时候出的问题 地址