簡體   English   中英

AWS Android SDK無法訪問“子目錄”中的s3

[英]AWS Android SDK not able to access s3 in “sub-directory”

我正在使用AWS API Gateway生成的android sdk來獲取s3(API網關后面的lambda)中對象的預簽名URL。

我的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}

我已經按照評論發表了意見。 但是我仍然以某種方式得到雙引號斜杠。 這是工作代碼

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}

我仍然歡迎有關如何改進此問題的進一步建議,但目前它正在起作用。 感謝您為我指出正確方向的意見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM