Android OSS自签名模式上传文件

鉴于对项目的安全着想,取消用STS鉴权模式(访问密钥(AccessKey ID和AccessKey Secret)要写到项目里)转用自签名模式上传文件,感觉要比平时上传文件(以上传图片参考)返回的更快更便捷一点,也不用亚索之类的,但官方文档上具体示例不是很详细,具体开发过程中也是根据后端来定具体方案的(苦的是我们),下面的示例也仅供参考;

这是官方文档:

您可以把AccessKey ID和AccessKey Secret保存在自有服务器中后,通过自有服务器对客户端信息进行签名。具体步骤如下:

  1. 在客户端获取并发送待签名的字符串到自有服务器。

    1. 构造请求时通过SDK中OSSCustomSignerCredentialProvider的signContent方法获取待签名的字符串。

    2. 发送待签名的字符串到自有服务器。

  2. 在自有服务器进行签名并返回签名后的字符串到客户端。

    1. 按照OSS规定的签名算法对待签名字符串进行签名。关于签名算法的更多信息,请参见在Header中包含签名

      签名算法的格式为signature = "OSS " + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content)),其中content是已根据请求参数拼接后的字符串。

    2. 返回签名后的字符串给客户端。

      假设服务端地址为http://localhost:8080/sign,将content传给服务端进行签名,获取签名后的signature返回给客户端。示例代码如下:

      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      
      OSSCredentialProvider credentialProvider = new OSSCustomSignerCredentialProvider() {
          @Override
          public String signContent(String content) {
              URL stsUrl = new URL("http://localhost:8080/sign?content=" + content);
              HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
              InputStream input = conn.getInputStream();
              String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
              JSONObject jsonObjs = new JSONObject(jsonText);
              String signature = jsonObjs.getString("signature");
              return signature;
          }
      };
      OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
    3. 在客户端发送签名后的字符串到OSS服务器进行鉴权。

至此结束,当然猛的一看觉得很简单的,真正和自己项目上用的话又是另一说了,一开始上面的signContent(String content)里的content是什么都不知道,可是结合自己后端接口后明白了,具体就是

请求入参,注意里面的时间类型获取要按照官方github里的OSSHeaderSignUrl.java这个类参考,(别问为啥当时我也是没注意卡在这个时间格式上),官方的github代码里写的是STS鉴权模式的,不过也情有可原,自签名模式下后端提供的都不一样无法做到一致或一个标准,下面就自己项目里的举例说一下最重要的地方,如果是自有服务器接口请求返回签名,即签名="OSS " + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content))格式,如下代码参考

OSSCredentialProvider credentialProvider = new OSSCustomSignerCredentialProvider() {
    @Override
    public String signContent(String content) {
        //具体代码不在这里展示,例如接口地址http://localhost:8080/getSign
        //这里一定要走同步请求(千万不要异步获取)返回的signature,return出去
        return signature;
    }
};
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
//填写bucketName,objectKey和uploadfilePath
PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, uploadfilePath);
//上传获取结果
PutObjectResult result = oss.putObject(put);
//result.getStatusCode()返回code判断
//获取上传成功后可访问的url
String  backUrl = oss.presignPublicObjectURL(bucketName,  objectKey);

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用阿里云官方提供的 OSS(对象存储服务)SDK 来实现 Android 上的文件功能。以下是一个简单的示例代码,需要先引入阿里云 OSS SDK 的依赖: ```java implementation 'com.aliyun.dpa:oss-android-sdk:3.1.8' ``` 然后,在你的代码中使用以下方法来实现文件: ```java import com.aliyun.dpa.oss.app.AppServiceFactory; import com.aliyun.dpa.oss.app.OSSClientFactory; import com.aliyun.dpa.oss.app.RunningConfig; import com.aliyun.dpa.oss.app.ServiceFactory; import com.aliyun.dpa.oss.app.UploadConfiguration; import com.aliyun.dpa.oss.app.UploadConfigurationFactory; import com.aliyun.dpa.oss.app.UploadManager; import com.aliyun.dpa.oss.app.util.FileUtil; import com.aliyun.dpa.oss.app.util.StringUtil; import com.aliyun.dpa.oss.app.util.UIUtil; import com.aliyun.dpa.oss.callback.ResultCallback; import com.aliyun.dpa.oss.model.OSSUploadConfiguration; import com.aliyun.dpa.oss.task.PutObjectTask; import com.aliyun.dpa.oss.task.TaskCancelledException; public class AliOSSUploader { private static final String ENDPOINT = "your_oss_endpoint"; // 你的 OSS Endpoint private static final String ACCESS_KEY_ID = "your_access_key_id"; // 你的 Access Key ID private static final String ACCESS_KEY_SECRET = "your_access_key_secret"; // 你的 Access Key Secret private static final String BUCKET_NAME = "your_bucket_name"; // 你的 Bucket 名称 public void uploadFile(String filePath) { // 创建 OSS 客户端 RunningConfig runningConfig = new RunningConfig(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ENDPOINT); AppServiceFactory.init(runningConfig); ServiceFactory serviceFactory = OSSClientFactory.createServiceFactory(); UploadConfiguration configuration = UploadConfigurationFactory.getUploadConfiguration(); UploadManager uploadManager = serviceFactory.createUploadManager(configuration); // 构造上任务 PutObjectTask putObjectTask = new PutObjectTask(BUCKET_NAME, StringUtil.generateRandomKey(), filePath); // 设置上结果回调 putObjectTask.setResultCallback(new ResultCallback() { @Override public void onSuccess(Object object) { // 文件成功 UIUtil.showToast("文件成功"); } @Override public void onFailure(Exception e) { // 文件失败 UIUtil.showToast("文件失败:" + e.getMessage()); } @Override public void onProgress(Object object, long currentSize, long totalSize) { // 文件进度 int progress = (int) (currentSize * 100 / totalSize); UIUtil.showToast("文件进度:" + progress + "%"); } @Override public void onCancel(Object object) { // 文件取消 UIUtil.showToast("文件取消"); } }); // 开始上任务 try { uploadManager.upload(putObjectTask); } catch (TaskCancelledException e) { // 上任务取消 UIUtil.showToast("文件取消"); } } } ``` 以上代码中的 `your_oss_endpoint`、`your_access_key_id`、`your_access_key_secret` 和 `your_bucket_name` 分别是你的 OSS Endpoint、Access Key ID、Access Key Secret 和 Bucket 名称。你需要将它们替换为你自己的实际值。 调用 `uploadFile` 方法并入要上文件路径,即可实现文件到阿里云 OSS。记得在 AndroidManifest.xml 中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 希望对你有帮助!如有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值