最近项目中需要上传多图片,最终要把图片上传到阿里云,所以这里就记录一下,希望能帮助到有需要的程序员。
首先怎么去注册获取对象空间,这里就不细说了,这是官网
接下来就说说安卓端接入的步骤:
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";
}
}
源码下载
好啦,就这么多,这里需要注意一下,上传的时候把图片压缩一下在上传,具体怎么压缩,下一篇中详细讲解。