我有一项使用 MultipartFile 将图像上传到 AWS S3 的服务。这些图像随后将作为公共文件提供。存在一个安全问题:这些图像可能包含敏感的 EXIF 元数据...
我有一项使用 MultipartFile 将图像上传到 AWS S3 的服务。这些图像随后将作为公共文件提供。存在一个安全问题:这些图像可能包含敏感的 EXIF 元数据(例如地理位置数据),必须在公开之前将其删除。
问题:我需要从这些图像中剥离 EXIF 元数据,而无需将整个文件加载到内存中,因为某些图像可能非常大。
我目前的做法是:
private S3Service.S3UploadedFile uploadImage(MultipartFile file) {
try {
ByteArrayOutputStream originalOut = stripMetadata(file.getInputStream());
final PipedInputStream in = new PipedInputStream();
new Thread(() -> {
try (final PipedOutputStream newOut = new PipedOutputStream(in)) {
originalOut.writeTo(newOut);
} catch (IOException e) {
// logging and exception handling should go here
}
}).start();
S3File processedS3File = S3File.builderOf(in, file.getContentType())
.isPublic(true)
.contentLength((long) originalOut.size())
.build();
return s3Service.upload(bucketName, processedS3File);
} catch (IOException | ImageWriteException | ImageReadException e) {
throw new RuntimeException("ERR");
}
}
public static ByteArrayOutputStream stripMetadata(InputStream imageInputStream)
throws IOException, ImageWriteException, ImageReadException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ExifRewriter exifRewriter = new ExifRewriter();
exifRewriter.removeExifMetadata(imageInputStream, outputStream);
return outputStream;
}
管道流的使用基于以下答案: https://.com/a/23874232/6157949
但是,在该 stripMetadata
方法中,我使用 Apache Commons Imaging 库来删除 EXIF 元数据。问题是它需要一个 OutputStream,而我目前使用的是 ByteArrayOutputStream,它会将整个图像加载到内存中。
我需要帮助:
我需要有关如何调整此方法的指导,以便我可以从图像中剥离 EXIF 元数据并将其上传到 S3,而无需将整个文件加载到内存中。
-
有没有办法将图像通过元数据剥离过程直接传输到 S3?
-
我可以使用不同的方法或库来更有效地处理大文件吗?
任何帮助或建议都将不胜感激!
如何在将图像上传到 S3 之前从图像中剥离 EXIF 元数据,而无需将整个文件加载到内存中
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!