AWS Android SDK无法访问“子目录”中的s3

时间:2017-07-02 17:50:48

标签: android amazon-web-services amazon-s3 aws-sdk

我正在使用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}

1 个答案:

答案 0 :(得分:0)

按照评论后我已经开始工作了。但是我仍然以某种方式得到双引号斜杠。这是工作代码

的Android

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;
    }
}

LAMBDA

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}

我仍然欢迎有关如何改进这一点的进一步建议,但现在它正在发挥作用。感谢您的评论指出了我正确的方向。