上传图片到阿里云

最近项目中需要上传多图片,最终要把图片上传到阿里云,所以这里就记录一下,希望能帮助到有需要的程序员。

首先怎么去注册获取对象空间,这里就不细说了,这是官网

接下来就说说安卓端接入的步骤:

1.首先去官网下载对应的SDK:这里是地址

2.把下载好的jar放到项目中的libs目录下。

3.下面就开始正式接入了,

在AndroidManifest.xml中添加权限:

<!--阿里云 start-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--阿里云 end-->

接下来开始初始化阿里云:
一般初始化建议在Application中进行,这里我是为了测试就在activity中初始化了。
这里只讲述上传成功的例子:

activity_up_load_image.xml 布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_up_load_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.imageselected.UpLoadImageActivity">

    <Button
        android:layout_marginTop="80dp"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="上传图片"/>

</RelativeLayout>

核心区域:UpLoadImageActivity

package com.example.imageselected;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.alibaba.sdk.android.oss.ClientConfiguration;
import com.alibaba.sdk.android.oss.ClientException;
import com.alibaba.sdk.android.oss.OSS;
import com.alibaba.sdk.android.oss.OSSClient;
import com.alibaba.sdk.android.oss.ServiceException;
import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
import com.alibaba.sdk.android.oss.callback.OSSProgressCallback;
import com.alibaba.sdk.android.oss.common.OSSLog;
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;
import com.alibaba.sdk.android.oss.model.ObjectMetadata;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import com.example.imageselected.aliyun.PutObjectSamples;
import com.example.imageselected.app.MyApplication;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 * 类名:
 * 类描述:上传图片到阿里云
 * 创建人:fly
 * 创建日期: 2017/1/13.
 * 版本:V1.0
 */
public class UpLoadImageActivity extends AppCompatActivity {
    private OSS oss;
    List<String> paths = new ArrayList<>(); // 本地需要上传图片的集合路径

    // 这个是外网域名的后半部分(外网域名 = bucket.endpoint),根据你申请的填一般是"http://oss-cn-hangzhou.aliyuncs.com"
    private static final String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";

    private static final String accessKeyId = "**********";  // 你申请的accessKeyId
    private static final String accessKeySecret = "**********"; // accessKeySecret
    private static final String uploadFilePath = MyApplication.getInstance().lists.get(0); // 这个路径是你要上传的文件的路径(本地)

    private static final String testBucket = "*****";  // 这个就是你申请的bucket名称
    private String uploadObject = getPhotoFileName();  // 这个是你要上传到OSS的文件路径,加入想上传到文件夹则前面加上****/****形式的路径即可

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_up_load_image);
        initOSS();
    }

    /**初始化阿里云*/
    private void initOSS() {
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);

        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
        conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
        conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
        conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
        OSSLog.enableLog();
        oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
    }

    public void click(View v){
        new Thread(new Runnable() {
            @Override
            public void run() {
                asyncPutObjectFromLocalFile(uploadObject,uploadFilePath);
            }
        }).start();
    }


    List<String> successPath = new ArrayList<>();  // 存储上传阿里云成功后的上传路径
    int number;

    /**
     * 从本地文件上传,使用非阻塞的异步接口
     * @param uploadObject 这个是你要上传到OSS的文件路径,加入想上传到文件夹则前面加上xxx/xxx形式的路径即可
     * @param locationPath  这个路径是你要上传的文件的路径(本地)
     */
    public void asyncPutObjectFromLocalFile(final String uploadObject, String locationPath) {

        // 判断图片是否全部上传
        // 如果已经是最后一张图片上传成功,则跳出
        number++;
        if (number == paths.size()) {
            // 结束的处理逻辑,并退出该方法

            return;
        }

        // 指定数据类型,没有指定会自动根据后缀名判断
//        ObjectMetadata objectMeta = new ObjectMetadata();
//        objectMeta.setContentType("image/jpeg");

        /**
         * 构造上传请求
         * oss 配置
         * testBucket 申请的Bucket名称
         * uploadObject  这个是你要上传到OSS的文件路径(一般是  "img" + "/" + "当前时间" + ".jpg";)
         * path  这个路径是你要上传的文件的路径(本地)
         */
        PutObjectRequest put = new PutObjectRequest(testBucket, uploadObject, locationPath);
//        put.setMetadata(objectMeta);

        // 异步上传时可以设置进度回调
        put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
            @Override
            public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                // 在这里可以实现进度条展现功能
                Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
            }
        });

        oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                Log.d("PutObject", "UploadSuccess");
                Log.e("PutObject", "上传图片成功");

                Log.d("ETag", result.getETag());
                Log.d("RequestId", result.getRequestId());

                successPath.add(uploadObject);  // 把当前上传图片成功的阿里云路径添加到集合

                // 这里进行递归单张图片上传,在外面判断是否进行跳出
                if (number <= paths.size() - 1) {
                    asyncPutObjectFromLocalFile(getPhotoFileName(),paths.get(number));
                }
            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常
                if (clientExcepion != null) {
                    // 本地异常如网络异常等
                    clientExcepion.printStackTrace();
                }
                if (serviceException != null) {
                    // 服务异常
                    Log.e("ErrorCode", serviceException.getErrorCode());
                    Log.e("RequestId", serviceException.getRequestId());
                    Log.e("HostId", serviceException.getHostId());
                    Log.e("RawMessage", serviceException.getRawMessage());
                }
//                ToastUtils.showShort(mContext, "图片上传失败,请重新上传");
            }
        });
    }

    /**
     *
     * @return 图片上传到阿里云的路径
     */
    public static String getPhotoFileName() {
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.getDefault());
        return "img" + "/" + dateFormat.format(date) + ".webp";
    }
}

源码下载
好啦,就这么多,这里需要注意一下,上传的时候把图片压缩一下在上传,具体怎么压缩,下一篇中详细讲解。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值