Android上传图片到七牛云

写在前边

  • 现在的时间:2019-06-23
  • 怎样获得一个七牛云的存储空间就不写了,重点是怎么上传图片.

准备工作-处理权限

网络权限

  • 添加访问网络权限
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 设置允许发送http请求,否则android默认不允许发送http请求:在清单文件application标签上添加android:usesCleartextTraffic="true"

读取文件权限

  • 添加读取系统文件权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • 因为是危险权限,还要作动态申请.
    private void getPer()
    {
        int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    
        if (permission != PackageManager.PERMISSION_GRANTED)
        {
            // 请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }
    

准备工作-获取七牛云相关的东西

获取AK与SK

获取要上传到的空间(bucket)

添加依赖

implementation 'com.qiniu:qiniu-android-sdk:7.3.15'
implementation 'com.qiniu:qiniu-java-sdk:7.2.+'

依赖主页:https://developer.qiniu.com/kodo/sdk/1236/android      https://github.com/qiniu/java-sdk

上传图片

protected void uploadPic()
{
    //指定zone的具体区域
    //FixedZone.zone0   华东机房
    //FixedZone.zone1   华北机房
    //FixedZone.zone2   华南机房
    //FixedZone.zoneNa0 北美机房


    /*
    Configuration config = new Configuration.Builder()
            .chunkSize(512 * 1024)        // 分片上传时,每片的大小。 默认256K
            .putThreshhold(1024 * 1024)   // 启用分片上传阀值。默认512K
            .connectTimeout(10)           // 链接超时。默认10秒
            .useHttps(true)               // 是否使用https 默认是false
            .responseTimeout(60)          // 服务器响应超时。默认60秒
            .recorder(recorder)           // recorder分片上传时,已上传片记录器。默认null
            .recorder(recorder, keyGen)   // keyGen 分片上传时,生成标识符,用于片记录器区分是那个文件的上传记录
            .zone(FixedZone.zone0)        // 设置区域,指定不同区域的上传域名、备用域名、备用IP。
    */


    Configuration config = new Configuration.Builder()
            .useHttps(true)               // 是否使用https上传域名
            .zone(FixedZone.zone0)        // 设置区域,指定不同区域的上传域名、备用域名、备用IP。
            .build();

    UploadManager uploadManager = new UploadManager(config); // UploadManager对象只需要创建一次重复使用

    String data = "/storage/emulated/0/DCIM/Camera/IMG_20190623_172115.jpg"; //要上传的文件
    String key = "test.jpg"; //在服务器的文件名
    /**
    * 生成token
    * create()方法的两个参数分别是 AK SK
    * uoloadToken()方法的参数是 要上传到的空间(bucket)
    */
    String token = Auth.create("kzdlPdSfFXp_Jgj32wlk5ef4r_Y171smSEyzYpX1", "SQ7MwgAQbsT1Sp-RwFg5iqK3m8vUU4fhCgvuEkIb").uploadToken("liyanxing-pic-server");

    /**
    * 调用put方法上传
    * 第一个参数 data:可以是字符串,是要上传图片的路径
    *                可以是File对象,是要上传的文件
    *                可以是byte[]数组,要是上传的数据
    * 第二个参数 key:字符串,是图片在服务器上的名称,要具有唯一性,可以用UUID
    * 第三个参数 token:根据开发者的 AK和SK 生成的token
    * 第四个参数:UpCompletionHandler的实例,有个回调方法
    * 第五个参数:可先参数
    */
    uploadManager.put
    (
        data, key, token,
        new UpCompletionHandler()
        {
            /**
            * 回调方法
            * @param key 开发者设置的 key 也就是文件名
            * @param info 日志,包含上传的ip等
            * @param res 包括一个hash值和key
            */
            @Override
            public void complete(String key, ResponseInfo info, JSONObject res)
            {
                if(info.isOK())
                {
                    Log.i("上传结果:", "Upload Success");
                }
                else
                {
                    Log.i("上传结果:", "Upload Fail");
                    //如果失败,这里可以把info信息上报自己的服务器,便于后面分析上传错误原因
                }
                Log.i("key:", key + "\ninfo:" + info + "\nres:" + res);
            }
        },
        null
    );
}

猜你喜欢

转载自blog.csdn.net/Sacredness/article/details/93397592