我正在使用AWS API Gateway生成的android sdk来获取s3中对象的预签名URL(lambda在API网关后面)。
我的s3存储桶看起来像这样:
* module_a
|\
| * file_a
| * subdir_a
| \
| * file_sa
* module_b
这适用于 file_a ,但对于 file_sa 则不然。至少当我使用android SDK时,我得到一个URL,其中斜杠被%25252F
替换。
但是,当我在控制台中测试api时,我得到了正确的URL。
我可以用SDK做些什么来解决这个问题吗?
更新
以下是此问题中涉及的代码段链。
Android代码下载文件(异常发生在最后一行)
fileName = "css/style.css"; // file in s3
moduleName = "main"; // folder in s3
[...]
ApiClientFactory factory = new ApiClientFactory().credentialsProvider(
aws.credentialsProvider);
apiClient = factory.build(myAPIClient.class);
apiClient.modulesModuleFileGet(fileName.replace("/", "%2F"), moduleName);
URL url = new URL(url_path.getUrl());
URLConnection connection = url.openConnection();
connection.connect();
InputStream in = new BufferedInputStream(connection.getInputStream());
API网关
上面使用的api端点配置了两个路径参数(模块名称和文件名)。调用lambda的正文映射模板如下所示:
#set($inputRoot = $input.path('$'))
{
"module" : "$input.params('module')",
"file": "$input.params('file')"
}
LAMBDA
from __future__ import print_function
import json
import urllib
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
key = event['module'] + "/" + event['file'].replace("%2F", "/")
url = s3.generate_presigned_url(
"get_object",
Params={'Bucket':"mybucket",
'Key': key},
ExpiresIn=60)
return {"url": url}
答案 0 :(得分:0)
按照评论后我已经开始工作了。但是我仍然以某种方式得到双引号斜杠。这是工作代码
public Url modulesModuleFileGet(String fileName, String moduleName) {
try {
String fileNameEnc = URLEncoder.encode(fileName, "UTF-8");
Url ret = getApiClient().modulesModuleFileGet(fileNameEnc, moduleName);
return ret;
} catch (UnsupportedEncodingException e){
Log.e(TAG, "> modulesModuleFileGet(", e);
return null;
}
}
def lambda_handler(event, context):
key = event['module'] + "/" + urllib.unquote_plus(urllib.unquote_plus(event['file']))
url = s3.generate_presigned_url(
"get_object",
Params={'Bucket':"my",
'Key': key},
ExpiresIn=60)
return {"url": url}
我仍然欢迎有关如何改进这一点的进一步建议,但现在它正在发挥作用。感谢您的评论指出了我正确的方向。