簡體   English   中英

從 AWS lambda 下載文件

[英]Download file from AWS lambda

class DownloadFileHandler RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

  @Overrider
  public APIGatewayProxyResponseEvent handlerRequest(APIGatewayProxyRequestEvent event, Context context) {
      String fileName = event.getQueryStringParameters().get("fileName");
      AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

      AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(Regions.US_EAST_2).build();
      GetObjectRequest request = new GetObjectRequest(bucket, fileName);
      S3Object objectFile = s3Client.getObject(request);
      S3ObjectInputStream objectInputStream = objectFile.getObjectContent();
      // latest I was trying this
      byte [] fileBytes = new byte[0];

      try {
        fileBytes = objectInputStream.readAllBytes();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    Map<String, String> headers = new LinkedHashMap<>();
    headers.put("Content-Type", "application/json");
    headers.put("Accept", "application/octet-stream");
    headers.put("Content-Disposition", String.format(Locale.UK, "attachment; filename=%s", fileName));
    headers.put("Content-Length", String.valueOf(fileBytes.length));
    // I tried this 
    JSONObject response = new JSONObject();
    response.append("file", objectFile);

    APIGatewayProxyResponseEvent responseEvent = new APIGatewayProxyResponseEvent()
      .withHeaders(headers)
      .withStatusCode(200)
      .withIsBase64Encoded(true)
      .withBody(Base64.getEncoder().encodeToString(fileBytes));

    return responseEvent;
  }
}

在上面的代碼中,我有requestHandler從 AWS S3 中提取文件,它應該將它作為響應發送。 我上面的代碼你可以看到我嘗試了至少兩種非工作方法。 我的意思是我可以將文件作為字符串發送,但我無法下載此文件。 我得到的而不是文件內容是

DIxMTc1NSAwMDAwMCBuDQowMDAwMjExODg3IDAwMDAwIG4NCjAwMDAyMTE5MTQgMDAwMDAgbg0KMDAwMDIxMjM5MiAwMDAwMCBuDQowMDAwMjE3NDQ3IDAwMDAwIG4NCjAwMDAyMTc1MTcgMDAwMDAgbg0KMDAwMDIxNzc4MiAwMDAwMCBuDQowMDAwMjE3ODYzIDAwMDAwIG4NCjAwMDAyMzExMDAgMDAwMDAgbg0KMDAwMDIzMTEyNyAwMDAwMCBuDQowMDAwMjMxNTA5IDAwMDAwIG4NCjAwMDAyMzY2MDkgMDAwMDAgbg0KMDAwMDIzNjY3OSAwMDAwMCBuDQowMDAwMjM2OTUwIDAwMDAwIG4NCjAwMDAyMzcwMzEgMDAwMDAgbg0KMDAwMDI0NTA4NSAwMDAwMCBuDQp0cmFpbGVyDQo8PC9TaXplIDE2Ny9Sb290IDE4IDAgUi9JbmZvIDE2IDAgUi9JRFs8RTdCRDQzNDY0Mzg0Q0M0OTU1QTVBQTNBRTIzMzQxNUI+PDM5RDcyRDQ5OEJGMzFFNDhCMEQ5QjkxODBFOEIzQzVFPl0vUHJldiAyMDI0MzA+Pg0Kc3RhcnR4cmVmDQoyNDk0NDgNCiUlRU9GDQo=%
[content cut out]

所以我假設那是文件。 但由於某種原因,我無法下載它,因為當我保存了這個文件時,它無法打開,出現file damaged etc.錯誤file damaged etc.

如果您能幫助我理解為什么這種方法不起作用,我將不勝感激? 我在有關它的 AWS 文檔中找不到任何 Java 示例。 大多數是關於 Python 或 JavaScript。 似乎我不理解它們,因為我看到的代碼如下

response = {
  "statusCode" : 200,
  "body" : file
}

或類似的東西。 對我來說,這意味着我必須將文件包裝到 JSON 對象中,然后從我的處理程序方法中返回它。 但這對我不起作用,因為我得到了你可以在上面看到的 2 個片段代碼。 請解釋我做錯了什么以及我不明白什么?

我不知道為什么這篇文章會得到減分,但無論如何。 如果@jarmod 可以理解我想從 Lambda 下載,並且他可以為我指出創建文件重定向請求的良好方向,因為將對象從 S3 拉到 Lambda 然后再次通過 HTTP 發送它是錯誤的方法,我認為 post夠清楚了。

這就是為什么我決定發布我的解決方案,這要歸功於 @jarmod 我可以想出。 在這個處理程序中,我使用S3Presinger ,如果有人使用 AWS 網關創建 API 並希望下載存儲在 AWS S3 上的文件,我認為它非常有用。

 public class DownloadFileHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
        String bucket = "";

        try (InputStream input = new FileInputStream("./config/application.properties")) {
            Properties properties = new Properties();
            properties.load(input);

            bucket = properties.getProperty("bucket");
        } catch (IOException e) {
            e.printStackTrace();
        }

        String fileName = event.getQueryStringParameters().get("fileName");

        S3Presigner presigner = S3Presigner.builder().build();

        GetObjectPresignRequest presignRequest = GetObjectPresignRequest
                .builder()
                .signatureDuration(Duration.ofMinutes(10))
                .getObjectRequest(GetObjectRequest.builder().bucket(bucket).key(fileName).build())
                .build();

        PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(presignRequest);

        String presignedURL = presignedGetObjectRequest.url().toString();
        Map<String, String> headers = new LinkedHashMap<>();
        headers.put("Content-Type", "application/json");
        headers.put("Location", presignedURL);

        APIGatewayProxyResponseEvent responseEvent = new APIGatewayProxyResponseEvent()
                .withHeaders(headers)
                .withStatusCode(302);

        return responseEvent;
    }
}

暫無
暫無

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

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