【问题标题】:Returning an Image from Byte Array in Java AWS lambda API Response从 Java AWS lambda API 响应中的字节数组返回图像
【发布时间】: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();
        }
    }

运行此程序后,图像文件正在下载,但打开时出现以下错误。

请帮我解决这个问题。

【问题讨论】:

    标签: java arrays amazon-s3 aws-lambda


    【解决方案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 的形式返回。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2018-10-22
    • 2018-03-28
    • 2023-03-08
    • 2016-08-15
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多