记录Android对接Java的OSS上传/回调踩过的坑

记录Android对接Java的OSS上传/回调踩过的坑

在网上找了很多资料,都没有关于Android与Java的OSS,就好像这种活java已经被php取代了一般,没办法只能自己动手了,万一~以后用的着呢。
在这里我是将直传与回调合并在了一起,用的是springboot。别问,问就是图个方便。

直传

传送门——快速搭建移动应用直传服务

下面先说一下Android,代码改动不大,直接复制粘贴稍作改动即可

// 推荐使用OSSAuthCredentialsProvider,token过期后会自动刷新。
String stsServer = "应用服务器地址,例如http://abc.com:8080"
OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer);
//config
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时时间,默认15秒
conf.setSocketTimeout(15 * 1000); // Socket超时时间,默认15秒
conf.setMaxConcurrentRequest(5); // 最大并发请求数,默认5个
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);

最重要的是java服务器,因为Android需要请求java服务器获取STS凭证(config.json中的配置信息),而后上传至OSS服务器,最后获取上传结果

下面是aliyun给的直传demo结构图

需要注意的是bucket_read_policy.txt与bucket_write_policy.txt是权限配置,具体查看
传送门——权限控制
demo结构图

下面是demo中的部分改动的代码(也可以不改,看个人情况而定)

/**
	 * Get请求
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
   
		
		// 读取配置文件。
		String data = ReadJson("./config.json");
		System.out.println("用户输入url:" + data);
		if (data.equals(""))
		{
   
			response(request, response, "./config.json is empty or not found");
			return;
		}
		System.out.println(data);
		JSONObject jsonObj  = JSONObject.fromObject(data);
		
		
		// 只有 RAM用户(子账号)才能调用 AssumeRole 接口
		// 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
		// 请首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys
		String accessKeyId = jsonObj.getString("AccessKeyID");
		String accessKeySecret = jsonObj.getString("AccessKeySecret");
		
		// RoleArn 需要在 RAM 控制台上获取
		String roleArn = jsonObj.getString("RoleArn");
		long durationSeconds = jsonObj.getLong("TokenExpireTime");
		String policy = ReadJson(jsonObj.getString("PolicyFile"));
		// RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
		// 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
		// 具体规则请参考API文档中的格式要求
		String roleSessionName = "alice-001";

		// 此处必须为 HTTPS
		ProtocolType protocolType = ProtocolType.HTTPS;

		try {
   
			final AssumeRoleResponse stsResponse = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName,
					policy, protocolType, durationSeconds);
			
			Map<String, String> respMap = new LinkedHashMap<String, String>();
			respMap.put("StatusCode", "200");
            respMap.put("AccessKeyId", stsResponse.getCredentials().getAccessKeyId());
            respMap.put("AccessKeySecret", stsResponse.getCredentials().getAccessKeySecret());
            respMap.put("SecurityToken", stsResponse.getCredentials().getSecurityToken());
            respMap.put("Expiration", stsResponse.getCredentials().getExpiration());
               
            JSONObject ja1 = JSONObject.fromObject(respMap);
            response(request, response, ja1.toString());
            
		} catch (ClientException e) {
   
			Map<String, String> respMap = new LinkedHashMap<String, String>();
			respMap.put("StatusCode", "500");
			respMap.put("ErrorCode", e.getErrCode());
			respMap.put("ErrorMessage", e.getErrMsg());        
            JSONObject ja1 = JSONObject.fromObject(respMap);
            response(request, response, ja1.toString());
		}
		
	}

而我把它改成了这样
这里的读取配置文件,我把它给注释了,因为我是想直接打成jar包运行比较方便,所以就懒得获取config.json相对路径了,我把config.json改成了config.property,直接在class中获取其属性

	@Value("${config.AccessKeyID}")
	private String AccessKeyID;
	@Value("${config.AccessKeySecret}")
	private String AccessKeySecret;
	@Value("${config.RoleArn}")
	private String RoleArn;
	@Value("${config.TokenExpireTime}")
	private Long TokenExpireTime;
	@Value("${config.PolicyFile}")
	private String PolicyFile;
	@Value("${config.Policy}")
	private String Policy;

可能你们会发现多出一个Policy属性,那是因为我把bucket_write_policy.txt(权限控制)中的内容直接写到了property中,哈哈方便嘛
喏~代码

config.AccessKeyID=
config.AccessKeySecret=
config.RoleArn=
config.TokenExpireTime=900
config.PolicyFile=bucket_write_policy.txt
config.Policy={
     "Statement": [    {
         "Action": [	      "oss:PutObject"      ],      "Effect": "Allow",      "Resource": ["acs:oss:*:*:yszs/yszs/*"]    }  ],  "Version": "1"}
/**
	 * Get请求
	 */
	@RequestMapping("/doGet")
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
   
		
		// 读取配置文件。
//		String data = ReadJson("./config.json");
//		System.out.println("用户输入url:" + data);
//		if (data.equals(""))
//		{
   
//			response(request, response, "./config.json is empty or not found");
//			return;
//		}
//		System.out.println(data);
//		JSONObject jsonObj  = JSONObject.fromObject(data);
		
		
		// 只有 RAM用户(子账号)才能调用 AssumeRole 接口
		// 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
		// 请首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys
		String accessKeyId = AccessKeyID;
		String accessKeySecret = AccessKeySecret;
		
		// RoleArn 需要在 RAM 控制台上获取
		String roleArn = RoleArn;
		long durationSeconds = TokenExpireTime;
		//將Policy直接放入config.properties中
		String policy = Policy;
		// RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
		// 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
		// 具体规则请参考API文档中的格式要求
		String roleSessionName 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值