Android 阿里云上传文件

最近公司有个需求,需要把本地的文件上传到阿里云。于是就有了这篇博客,记录下来,以免忘记。
阿里云官方文档
这里涉及到AccessKeyId,SecretKeyId,bucket和endPoint这几个常量,这都是从阿里云上创建生成的。
上传文件的主要代码

private OSS initializationOss() {
		// 在移动端建议使用STS方式初始化OSSClient。
		// 更多信息可查看sample 中 sts
		// 使用方式(https://github.com/aliyun/aliyun-oss-android-sdk/tree/master/app/src/main/java/com/alibaba/sdk/android/oss/app)
// OSSCustomSignerCredentialProvider
		OSSCustomSignerCredentialProvider ossCustomSignerCredentialProvider = new OSSCustomSignerCredentialProvider() {

			@Override public String signContent(String content) {
				return OSSUtils.sign(accessKeyId, accessKeySecret, content);
			}
		};

		// 该配置类如果不设置,会有默认配置,具体可看该类
		ClientConfiguration conf = new ClientConfiguration();
		conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
		conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
		conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个
		conf.setMaxErrorRetry(5); // 失败后最大重试次数,默认2次
		// ------>end of log
		if (BuildConfig.DEBUG) { // 这里你可根据自己业务需求是否开启阿里云的日志
			OSSLog.enableLog();
		}
		OSS oss = new OSSClient(App.getApplication(), endPoint, ossCustomSignerCredentialProvider);
		return oss;
	}

注意:上边代码使用的是自签名模式(OSSCustomSignerCredentialProvider),关于自签名和sts鉴权模式,可以访问访问控制,还有就是阿里云不建议在移动端使用OSSPlainTextAKSKCredentialProvider这个类传入到OSSClient构造方法来实例化,具体原因得从阿里云官网找。
下边就是上传代码

private void upload(final String fileName) {
		// 构造上传请求
		String objectKey = getObjectFileKey(fileName);
		if (TextUtils.isEmpty(objectKey)) {
			return;
		}
		
		// 主要参数就是这三个,分别上传bucketName,然后就是你上传到阿里云的文件夹,最后就是你上传的文件在手机上的路径(包含文件后缀的完成路径)
		PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, fileName);
		// 异步上传时可以设置进度回调
		put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
  			@Override
 		 	public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
    			Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
  			}
		});
		OSSAsyncTask task = initializationOss().asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {

			@Override public void onSuccess(PutObjectRequest request, PutObjectResult result) {
				Log.e("上传日志成功" , fileName);
			}

			@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());
				}
			}
		});
		// task.cancel(); // 可以取消任务
		// task.waitUntilFinished(); // 可以等待直到任务完成
	}
	
	public String getObjectFileKey(String path) {
		String[] pathArrays = path.split("/");
		if (pathArrays == null) {
			return null;
		}
		// 这里是根据路径来获取文件夹的名字。
		String channelId = pathArrays[pathArrays.length - 2];
		String fileName = pathArrays[pathArrays.length - 1];
		// 一个/表示创建一个文件夹,这里可以根据自己需求改,不需要跟我这一样,我这的需求是把文件上传到Android文件夹下的channelId文件夹里
		return String.format("Android/%s/%s.txt", channelId, fileName);
	}

就这么简单。

public class GetAndUploadFileDemo { private static String TAG = "GetAndUploadFileDemo"; private OSSService ossService; private OSSBucket bucket; public void show() { ossService = OSSServiceProvider.getService(); bucket = ossService.getOssBucket("youcaidao"); // 文件的常规操作如普通上传、下载、拷贝、删除等,与Data类一致,故这里只给出断点下载和断点上传的demo resumableDownloadWithSpecConfig(); // delay(); // resumableUpload(); // delay(); // resumableDownload(); // delay(); } public void delay() { try { Thread.sleep(30 * 1000); } catch (Exception e) { e.printStackTrace(); } } // 断点上传 public void resumableUpload() { // OSSData ossData = ossService.getOssData(sampleBucket, "sample-data"); // ossData.setData(data, "raw"); // 指定需要上传的数据和它的类型 // ossData.enableUploadCheckMd5sum(); // 开启上传MD5校验 // ossData.upload(); // 上传失败将会抛出异常 OSSFile bigfFile = ossService.getOssFile(bucket, "de.jpg"); try { bigfFile.setUploadFilePath( "/storage/emulated/0/Android/data/com.qd.videorecorder/video/VMS_1439866564822.jpg", "image/jpg"); bigfFile.ResumableUploadInBackground(new SaveCallback() { @Override public void onSuccess(String objectKey) { Log.d(TAG, "[onSuccess] - " + objectKey + " upload success!"); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { Log.d(TAG, "[onProgress] - current upload " + objectKey + " bytes: " + byteCount + " in total: " + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { Log.e(TAG, "[onFailure] - upload " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); ossException.getException().printStackTrace(); } }); } catch (FileNotFoundException e) { e.printStackTrace(); } } // 断点下载 public void resumableDownload() { OSSFile bigFile = ossService.getOssFile(bucket, "bigFile.dat"); bigFile.ResumableDownloadToInBackground( "/storage/sdcard0/src_file/bigFile.dat", new GetFileCallback() { @Override public void onSuccess(String objectKey, String filePath) { Log.d(TAG, "[onSuccess] - " + objectKey + " storage path: " + filePath); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { Log.d(TAG, "[onProgress] - current download: " + objectKey + " bytes:" + byteCount + " in total:" + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { Log.e(TAG, "[onFailure] - download " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); } }); } // 设置相关参数的断点续传 public void resumableDownloadWithSpecConfig() { OSSFile bigFile = ossService .getOssFile(bucket, "VMS_1439866564822.jpg"); ResumableTaskOption option = new ResumableTaskOption(); option.setAutoRetryTime(2); // 默认为2次,最大3次 option.setThreadNum(2); // 默认并发3个线程,最大5个 bigFile.ResumableDownloadToInBackground( "/storage/emulated/0/Android/data/com.qd.videorecorder/video/VMS_1439866564822.jpg", new GetFileCallback() { // /storage/emulated/0/DCIM/Camera/VID_20150803_173350.mp4 @Override public void onSuccess(String objectKey, String filePath) { System.out.println("[onSuccess] - " + objectKey + " storage path: " + filePath); } @Override public void onProgress(String objectKey, int byteCount, int totalSize) { System.out.println("[onProgress] - current download: " + objectKey + " bytes:" + byteCount + " in total:" + totalSize); } @Override public void onFailure(String objectKey, OSSException ossException) { System.out.println("[onFailure] - download " + objectKey + " failed!\n" + ossException.toString()); ossException.printStackTrace(); } }); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值