简单上传本地文件
调用同步接口上传:
- // 构造上传请求
- PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
- // 文件元信息的设置是可选的
- // ObjectMetadata metadata = new ObjectMetadata();
- // metadata.setContentType("application/octet-stream"); // 设置content-type
- // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校验MD5
- // put.setMetadata(metadata);
- try {
- PutObjectResult putResult = oss.putObject(put);
- Log.d("PutObject", "UploadSuccess");
- Log.d("ETag", putResult.getETag());
- Log.d("RequestId", putResult.getRequestId());
- } catch (ClientException e) {
- // 本地异常如网络异常等
- e.printStackTrace();
- } catch (ServiceException e) {
- // 服务异常
- Log.e("RequestId", e.getRequestId());
- Log.e("ErrorCode", e.getErrorCode());
- Log.e("HostId", e.getHostId());
- Log.e("RawMessage", e.getRawMessage());
- }
注意:在Android中,不能在UI线程调用同步接口,只能在子线程调用,否则将出现异常。如果希望直接在UI线程中上传,请使用异步接口。
调用异步接口上传:
- // 构造上传请求
- PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
- // 异步上传时可以设置进度回调
- put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
- @Override
- public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
- Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
- }
- });
- OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
- @Override
- public void onSuccess(PutObjectRequest request, PutObjectResult result) {
- Log.d("PutObject", "UploadSuccess");
- Log.d("ETag", result.getETag());
- Log.d("RequestId", result.getRequestId());
- }
- @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(); // 可以等待任务完成
简单上传二进制byte[]数组
- byte[] uploadData = new byte[100 * 1024];
- new Random().nextBytes(uploadData);
- // 构造上传请求
- PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadData);
- try {
- PutObjectResult putResult = oss.putObject(put);
- Log.d("PutObject", "UploadSuccess");
- Log.d("ETag", putResult.getETag());
- Log.d("RequestId", putResult.getRequestId());
- } catch (ClientException e) {
- // 本地异常如网络异常等
- e.printStackTrace();
- } catch (ServiceException e) {
- // 服务异常
- Log.e("RequestId", e.getRequestId());
- Log.e("ErrorCode", e.getErrorCode());
- Log.e("HostId", e.getHostId());
- Log.e("RawMessage", e.getRawMessage());
- }
上传到文件目录
OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,这个文件可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。
在上传文件时,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。
注意:OSS路径默认是”根目录”,不需要以’/‘开头。
上传Content-Type设置
在Web服务中Content-Type用来设定文件的类型,决定以什么形式、什么编码读取这个文件。某些情况下,对于上传的文件需要设定Content-Type,否则文件不能以自己需要的形式和编码来读取。使用SDK上传文件时,如果不指定Content-Type,SDK会帮您根据后缀自动添加Content-Type。
- // 构造上传请求
- PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
- ObjectMetadata metadata = new ObjectMetadata();
- // 指定Content-Type
- metadata.setContentType("application/octet-stream");
- // user自定义metadata
- metadata.addUserMetadata("x-oss-meta-name1", "value1");
- put.setMetadata(metadata);
- OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
- ...
- });
MD5校验设置
如果要校验上传到OSS的文件和本地文件是否一致,可以在上传文件时携带文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器接收到的文件MD5值和Content-MD5一致时才可以上传成功,从而保证上传数据的一致性。
- // 构造上传请求
- PutObjectRequest put = new PutObjectRequest("<bucketName>", "<objectKey>", "<uploadFilePath>");
- ObjectMetadata metadata = new ObjectMetadata();
- metadata.setContentType("application/octet-stream");
- try {
- // 设置Md5以便校验
- metadata.setContentMD5(BinaryUtil.calculateBase64Md5("<uploadFilePath>")); // 如果是从文件上传
- // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(byte[])); // 如果是上传二进制数据
- } catch (IOException e) {
- e.printStackTrace();
- }
- put.setMetadata(metadata);
- OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
- ...
- });