使用的policy如下
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:my-bucket/Test/user:123/*"
]
}
]
}
向 my-bucket/Test/user:123/a.txt 上传时
ByteArrayInputStream in = new ByteArrayInputStream("Hello OSS".getBytes());
stsClient.putObject("my-bucket", "Test/user:123/test.txt", in);
被权限拒绝
com.aliyun.oss.OSSException: Access denied by authorizer's policy.
但如果去掉冒号,或者授权资源改为my-bucket/Test/*
就一切正常,就是单独为带特殊符号的路径授权时无效
这个问题是由于OSS的权限策略中,资源路径不能包含冒号(:)。你可以尝试将资源路径中的冒号替换为其他字符,例如下划线(_)或者短横线(-),然后再进行授权。
修改后的policy如下:
然后,你可以使用以下代码上传文件:
您遇到的问题可能与OSS的URL编码规则有关。当您的资源路径包含特殊字符(如冒号)时,这些字符需要进行URL编码才能正确地作为授权策略中的资源。
要解决这个问题,您可以尝试以下方法:
使用URL编码:
%3A
。使用通配符:
"acs:oss:*:*:my-bucket/Test/user*/*"
,这样就可以匹配到包含冒号的路径。使用预签名URL上传文件:
楼主你好,看了你的问题,个人觉得是由于冒号是URL中的保留字符,需要经过URL编码才能正确传递,你可以使用Java中的URLEncoder类对资源进行URL编码,然后将编码后的资源名称作为授权资源。
然后在上传时,需要将文件名使用encodeURI或encodeURIComponent进行编码,以便能够在URL中正确地传递冒号字符。