在网上找了很多资料,都没有关于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中的部分改动的代码(也可以不改,看个人情况而定)
/**
* 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