[英]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.