首页 > 解决方案 > 如何使用资源尝试将 S3Object 转换为 File 并在 Java 中返回 File Object?

问题描述

我有一个service方法,它File Object从给定的AWS S3存储桶返回一个fileName. 我想将 S3Object 转换为 File 对象并返回相同的值。

我不想使用任何临时位置来下载文件,只想将其转换S3ObjectFileObject 并返回它。

我也想try 与资源一起使用IOUtils

我的问题是执行com.amazonaws.util.IOUtils.copy(InputStream in, OutputStream out)获取文件对象的方法的正确方法是什么。调用方法将使用此 File 对象进行进一步处理,因此我不想将其保存在本地。我尝试了类似的方法,但它抛出了 FileNotFoundException。

我确定我在这方面遗漏了一些东西,可能是IOUtils.copy必须以不同的方式使用。或者我没有正确使用资源。

    public File getFileFromBucket(String fileName) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(aWSBucketName, fileName);
        S3Object s3Object = aWSS3client.getObject(getObjectRequest);
        File s3File = new File(fileName);
        try (FileOutputStream fos = new FileOutputStream(s3File)) { //throws Exception
            IOUtils.copy(s3Object.getObjectContent(), fos); 
        } catch (IOException e) {
            log.debug("IOException Occurred while fetching file {}", fileName);
            e.printStacktrace();
        }
        return s3File;
    }

返回文件的正确方法是什么?任何帮助表示赞赏,在此先感谢。

编辑

如果我不想在本地保存文件对象,是否建议将InputStream返回给调用方法?

如前所述,调用方法使用apache poi库来解析 excel 文件。

org.apache.poi.xssf.usermodel.XSSFWorkbook.XSSFWorkbook(InputStream is) 这种方法无论如何都需要InputStream作为参数。

我不知道为什么我想把它转换成一个文件

问题:

是否建议将S3Object.getObjectContent()as an发送InputStream到调用方法,或者有更好的方法吗?

标签: javaamazon-web-servicesfileamazon-s3inputstream

解决方案


在咨询了我的前辈之后,我发现发送InputStream到调用方法是可以的。

如果InputStream需要保存到本地系统,则IOUtils.copy可以在需要时使用。

转换InputStreamFile然后再转换回InputStream是浪费计算。

因此我的方法只是返回ObjectContent这样的:

public InputStream getFileInputStreamFromBucket(String fileName) {
        GetObjectRequest getObjectRequest = new GetObjectRequest(aWSBucketName, fileName);
        S3Object s3Object = aWSS3client.getObject(getObjectRequest);
        InputStream fileInputStream = s3Object.getObjectContent();
        log.debug("File Input Stream fetched from s3 bucket for File {} ", fileName);
        return fileInputStream;
    }

这似乎是正确的选择。

如果有人有更好的发回方式,InputStream请随时发布答案。


推荐阅读