从 Java AWS lambda API 响应中的字节数组返回图像
Posted
技术标签:
【中文标题】从 Java AWS lambda API 响应中的字节数组返回图像【英文标题】:Returning an Image from Byte Array in Java AWS lambda API Response 【发布时间】:2021-12-13 13:44:36 【问题描述】:我的 Aws S3 bukcet 中有一个图像文件 001.jpg。 我正在尝试使用 Java 下载该文件。下面是一段用于从 s3 存储桶下载图像文件的代码。
if (StringUtils.isNotEmpty(s3Key))
AmazonS3Connector s3 = AmazonS3Connector.getInstance();
byte[] data = null;
try
final S3Object s3Object = s3.getClient().getObject(S3_BUCKET_NAME, s3Key);
final S3ObjectInputStream stream = s3Object.getObjectContent();
data = IOUtils.toByteArray(stream);
s3Object.close();
String fileName = s3Key.split("/")[1];
Map<String, String> responseHeaders = new HashMap<>();
MimetypesFileTypeMap mimetypesFileTypeMap = new MimetypesFileTypeMap();
responseHeaders.put("Content-type", mimetypesFileTypeMap.getContentType(s3Key));
responseHeaders.put("Content-Length", String.valueOf(data.length));
responseHeaders.put("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
return APIResponse.builder()
.setStatusCode(200)
.setObjectBody(data)
.setHeaders(responseHeaders)
.build();
catch (AmazonS3Exception s3Exception)
throw new IllegalArgumentException("File does not exists");
catch (IOException e)
new OutwinErrorQueue().exception(e).log();
运行此程序后,图像文件正在下载,但打开时出现以下错误。
请帮我解决这个问题。
【问题讨论】:
【参考方案1】:你可以试试这个:
public void downloadFile(String fileName)
S3Object s3Object = s3Client.getObject(bucketName, fileName);
S3ObjectInputStream inputStream = s3Object.getObjectContent();
try
byte[] content = IOUtils.toByteArray(inputStream);
ByteArrayInputStream bis = new ByteArrayInputStream(content);
BufferedImage bImage2 = ImageIO.read(bis);
ImageIO.write(bImage2, "jpg", new File("path/to/output.jpg"));
catch (IOException e)
e.printStackTrace();
AWSconfig 是这样的:
@Configuration
public class AmazonConfig
private final String ACCESS_KEY = "*****KEY*****";
private final String SECRET_KEY = "*****KEY*****";
@Bean
public AmazonS3 s3()
AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
return AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion("ap-south-1")
.build();
您还可以在保存图像文件时使用s3Client.getUrl(bucketName, fileName).toString();
获取该文件的 URL。
我使用的依赖:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.931</version>
</dependency>
【讨论】:
嗨 Neeraj,我已经编辑了问题。还是不行。 我的图片的 URL 是这样的reddit-clone-spring-boot.s3.ap-south-1.amazonaws.com/…,文件名是1634299258114_big-sur-mountains-night-dark-macos-big-sur-stock-california-1366x768-1493.jpg
。我只是修改public void downloadFile(String fileName)
方法。试试看。
它将图像文件存储到位置的路径,我需要的是我想在api响应中返回这个图像。我怎样才能做到这一点?
您可以在响应中以 URL 的形式返回。以上是关于从 Java AWS lambda API 响应中的字节数组返回图像的主要内容,如果未能解决你的问题,请参考以下文章
将 AWS Lambda 429 错误映射到 API Gateway 2XX 响应
如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应?
将 Lambda 运行时从 Node 8.x 更改为 Node 12.x 后,从 AWS API Gateway 随机获得 502 Bad Gateway 响应
AWS Lambda 和 API Gateway 响应集成问题
AWS Java Lambda 压缩 JSON 响应失败:“由于配置错误,执行失败:格式错误的 Lambda 代理响应”