如何从 S3Object 获取输出流?
How to get outputstream from an S3Object?
我的目标是从 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 SDK 在 S3 上使用对象来做同样的事情?上面的 updateXmpXml
方法需要 OutputStream
作为第二个参数。但是,我在 AWS sdk http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/allclasses-noframe.html
中没有看到任何输出流 class
http://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html
使用 Apache 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();
我的目标是从 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 SDK 在 S3 上使用对象来做同样的事情?上面的 updateXmpXml
方法需要 OutputStream
作为第二个参数。但是,我在 AWS sdk http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/allclasses-noframe.html
http://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html
使用 Apache 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();