如何从 S3Object 获取输出流?

Posted

技术标签:

【中文标题】如何从 S3Object 获取输出流?【英文标题】:How to get outputstream from an S3Object? 【发布时间】:2017-03-08 20:00:19 【问题描述】:

我的目标是从 S3 获取对象(图像),更改文件的元数据,并将其替换为已更改元数据的新文件。

为了更改我正在使用的元数据commons imaging library。我已经对下面的示例进行了编码,该示例按预期工作,但不处理 S3。

File newFile = new File("newImage2.jpg");
OutputStream os = new BufferedOutputStream(new FileOutputStream(newFile))
InputStream isNew = new BufferedInputStream(new FileInputStream(newFile))
InputStream is = new BufferedInputStream(new FileInputStream(new File("newImage.jpg")))
try 
            String xmpXml = "<x:xmpmeta>" +
            "\n<Lifeshare>" +
            "\n\t<Date>"+"some date"+"</Date>" +
            "\n\t<Latitude>"+"somelat"+"</Latitude>" +
            "\n\t<Longitude>"+"somelong"+"</Longitude>" +
            "\n\t<Altitude>"+"somealt"+"</Altitude>" +
            "\n\t<Z>"+"someZ"+"</Z>" +
            "\n\t<X>"+"someX"+"</X>" +
            "\n\t<Y>"+"Some y"+"</Y>" +
            "\n</Lifeshare>" +
            "\n</x:xmpmeta>";
            JpegXmpRewriter rewriter = new JpegXmpRewriter();
            rewriter.updateXmpXml(is,os, xmpXml);
            String newXmpXml = Imaging.getXmpXml(isNew, "newImage2.jpg");
            println newXmpXml
        
finally 
   is.close()
   os.close()

以上工作,因为我可以在newimage2.jpg 上运行exiftool 并查看设置的元数据属性:

$ exiftool newImage2.jpg | grep "Lifeshare"
Lifeshare Date                  : some date
Lifeshare Latitude              : somelat
Lifeshare Longitude             : somelong
Lifeshare Altitude              : somealt
Lifeshare Z                     : someZ
Lifeshare X                     : someX
Lifeshare Y                     : Some y

问题

如何使用 AWS S3 开发工具包在 S3 上使用对象来执行相同的操作?上面的updateXmpXml 方法需要OutputStream 作为第二个参数。但是,我在 AWS sdk http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/allclasses-noframe.html 中没有看到任何输出流类

【问题讨论】:

【参考方案1】:

http://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html

使用阿帕奇ioutils

OutputStream os = new ByteArrayOutputStream();


    AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());        
    S3Object object = s3Client.getObject(
                      new GetObjectRequest(bucketName, key));
    InputStream in= object.getObjectContent();
    IOUtils.copy(in, out);

    in.close();
    out.close();

【讨论】:

OutputStream os = ... 中应该写什么?我不想将文件保存到本地文件系统。我只想使用流。 你真的不必写入临时文件

以上是关于如何从 S3Object 获取输出流?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?

java如何获取classpath中某文件的输出流

如何同时在命令窗口和文本文档中获取流输出

如何从response里面取出向客户端输出的html流

Azure 流分析获取前一个输出行以加入输入

JAVA:已知获取文件的输出流ouputStream,怎么转换为文件