Android客户端实现七牛云存储文件上传

摘要:
用于测试时,您可以使用本地模拟令牌信息来本地模拟令牌的信息1.2本地模拟令牌1.1.1本地模拟令牌。/***获取本地生成的令牌**@return*/privateStringgetToken(){Macmac=newMac;PutPolicyputPolicy=newPutPolicy;putPolicy.returnBody=“{”name“:$,”size“:”$“,”w“:“$”,”h“:”#“,”key“:$}”;尝试{Stringuptoken=putPolicy.token;System.out.println;returnuptoken;}catch{e.printStackTrace();}catch{e.printStackTrack(),}returnnull;}1.2简单文件上传小于4M,采用简单文件上传方式。Key指定存储在ECS上的文件名。回应七公牛队的反馈。断点记录类需要实现com.qiniu.android.storage.Recorder接口。已提供保存到文件的FileRecorder实现。为了避免记录文件冲突,您还可以自定义文件名:UploadManageruploadManager=newUploadManager;2.碎片文件上传2.1官方相关概念2.2碎片文件上传相关代码示例将要上传的文件信息转换为upload对象。

1.简单文件上传  上传模型如下。

image

   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 指定存储在云服务器上的文件名字。并会通过返回值返回出来。
infohttp请求的状态信息等,可记入日志。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官方相关概念

  image

image

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 + "
";
        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() + "  
可到" + 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客户端实现七牛云存储文件上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇常用电源及稳压芯片(一)ldd 以及 ld-linux.so.2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FastDFS分布式图片服务器搭建

一:Fastdfs简介 1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。  FastDFS 架构包括 Tracker se...

.NET 通用多条件动态参数查询方法 SqlSugar ORM

通用查询用途 一般我们Grid控件,会有很多条件传给后台,如果每个条件都写一个逻辑的话,那么工作量将非常大,所以通用查询功能是每个软件必备的, SqlSugar将通用查询封装到支持了树型条件,并且支持所有常用的操作,用SqlSugar或者不用SqlSugar的都可参参考一下 1、简单多条件多动参数 创建数据库对象 //创建数据库对象 SqlSugarCl...

建行互联网银企被扫支付

背景 最近在对接建行的支付,我们做的是被扫支付,就是B扫C,一开始对方发了一个压缩包给我,看起来挺齐全的,文档、demo啥的都有,以为很简单,跟微信支付宝类似,调一下接口,验证一下就OK了。然而,事实证明我还是太年轻了。而且网络上你能够搜到的基本上都用不了,所以记一下博客,或许可以帮助其他人。 先说一下建行支付比较特殊的地方吧 1、官方提供的demo里面,...

五,自定义监控项并创建图形

目录 五,zabbix自定义监控项 一,为什么要自定义监控项 二,自定义监控项中的基础概念 三,自定义监控项配置 1,自定义监控项基本格式 2,在agent上自定义监控项 3,web页面添加监控项 4,为该监控项创建一个图形 五,zabbix自定义监控项 一,为什么要自定义监控项 有的时候zabbix提供的监控项目,不能满足我们生产环境下...

asp.net简单实现利用HttpModule实现防sql注入

关于sql注入,已经被很多人讨论过了。这篇没有新意功能也不够通用,nnd,不想引起口水,就是觉得简单而且思路有参考性才贴出来。1、新建一个类,实现IHttpModule接口 代码     public class SqlHttpModule : IHttpModule    {        public void Dispose()        { ...

Java 根据 Map 的 key 的 ASCII 码从小到大排序

1.主要有两种方式,第一种使用treemap,第二种使用sort方法对map的key进行排序重组一个新的map 。一般使用treemap  import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public cl...