从 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 代理响应”

AWS Lambda,API Gateway 返回 Malformed Lambda 代理响应,502 错误