繁体   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