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#使用七牛云存储上传下载文件、自定义回调
项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现. 做了一个简易的压力测试,同时上传多个文件,七牛自己应该有队列处理并发请求,我无论同时提交多少个文件,七牛是批量一个个排队处理了. 一个 ...
随机推荐
- Unity3D基础学习之AssetBundle 资源包创建与加载
前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了.下面介绍AssentBundle. AssetBundles让你通过WWW类流式加载额外 ...
- 使用MySQL的LAST_INSERT_ID--转
LAST_INSERT_ID 自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里 The ID that was generat ...
- How to configure Gzip for JBoss?---refer
Question: I think to try to speed up my Web App by reducing the size of transferred data. For exampl ...
- [转] 深入剖析 linux GCC 4.4 的 STL string
本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术. 平台:x86_64-redhat-linux gcc ver ...
- Verilog中锁存器与多路选择器
Verilog中锁存器与多路选择器 Verilog是一种硬件描述语言,它代表的是硬件. Verilog代表的就是逻辑门和连接线. 对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的 ...
- PHP博客小项目之知识点(1)
一.博客系统介绍 Blog.Bloger.web log(网络日志) 博客主要发布一些文章.图片:博客一般都是个人博客: 博客的文章,一般都是按照时间倒序排列: 博客,仅音译,英文名为Blogger, ...
- Hibernate 关联查询 相关错误
错误提示: could not resolve property: 确定有相关属性时,记得使用 criteria.createAlias @ManyToOne 若可能为null 要加上 @NotFou ...
- 无法连接vCenter Server清单https://IP:10443
VMware vCenter Server服务器安装系统的时候使用一个IP,安装完VMware vCenter后来更换了另外一个IP,当使用vSphere Web Client登陆VMware vCe ...
- iOS8中添加的extensions总结(四)——Action扩展
Action扩展 注:此教程来源于http://www.raywenderlich.com的<iOS8 by Tutorials> 1.准备 本次教程利用网站bitly.com进行 bit ...
- php引用传值
isset();判读值是否值在 unset();取消变量 <?php$a=array("a","b","c");$b=$a;$b[2] ...