简单上传是指通过PutObject方法上传单个文件(Object)。简单上传包括上传本地文件和二进制byte[]数组。

上传本地文件

您可以通过同步方式或者异步方式上传本地文件到OSS。

  • 调用同步接口上传

    以下代码用于以同步方式上传examplefile.txt文件到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。

    // 构造上传请求。
    // 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件完整路径(例如/storage/emulated/0/oss/examplefile.txt)。
    // Object完整路径中不能包含Bucket名称。
    // 关于Bucket名称命名规范的更多信息,请参见Bucket。
    // 关于Object名称命名规范的更多信息,请参见Object。
    PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");
    
    // 设置文件元信息。
    // ObjectMetadata metadata = new ObjectMetadata();
    // 设置Content-Type。
    // metadata.setContentType("application/octet-stream"); 
    // 校验MD5。
    // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); 
    // 设置Object访问权限。默认值为private,表示私有权限。
    // metadata.setHeader("x-oss-object-acl", "private");
    // 设置Object的存储类型,默认与Bucket存储类型一致。此处设置为Standard,表示标准存储类型。
    // metadata.setHeader("x-oss-storage-class", "Standard");
    // 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());
    }

    对于Android10及之后版本的分区存储,您可以使用文件的Uri上传文件到OSS。

    // 构造上传请求。
    // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。
    // Object完整路径中不能包含Bucket名称。
    PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt",fileUri);
    
    // 设置文件元信息。
    // ObjectMetadata metadata = new ObjectMetadata();
    // 设置Content-Type。
    // metadata.setContentType("text/plain"); 
    // 校验MD5。
    // metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); 
    // 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线程中上传,请使用异步接口。

    以下代码用于以异步方式上传examplefile.txt文件到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。

    // 构造上传请求。
    // 依次填写Bucket名称(例如examplebucket)、Object完整路径(例如exampledir/exampleobject.txt)和本地文件完整路径(例如/storage/emulated/0/oss/examplefile.txt)。
    // Object完整路径中不能包含Bucket名称。
    PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");
    
    // 异步上传时可以设置进度回调。
    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(); 

    对于Android10及之后版本的分区存储,您可以使用文件的Uri上传文件到OSS。

    // 构造上传请求。
    // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。
    // Object完整路径中不能包含Bucket名称。
    PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", fileUri);
    
    // 异步上传时可以设置进度回调。
    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[]数组到目标存储空间examplebucket中exampledir目录下的exampleobject.txt文件。

byte[] uploadData = new byte[100 * 1024];
new Random().nextBytes(uploadData);

// 构造上传请求。
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。
// Object完整路径中不能包含Bucket名称。
PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", 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());
}

相关文档

  • 关于简单上传的完整示例代码,请参见GitHub示例
  • 关于简单上传的API接口说明,请参见PutObject