作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此示例使用的文件很可能不在 RAM 中:
http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html
但我已经从某个客户端请求获得了一个缓冲文件,在下面的代码中,这个文件被写入磁盘,但是为什么?它通过写入磁盘使整个过程变慢,我不能避免吗?
编辑(下面是对我想要实现的目标的解释):
用户的图像被上传,然后由服务器缩放,然后保存在服务器的磁盘上,然后才将缩放后的图像发送到 AWS,之后用户获得图像驻留在亚马逊服务器上的 aws 链接。
public void transferToS3(String region, String bucket, String entity, String resolution, String filename, BufferedImage bufferedImage) {
if (bufferedImage != null) {
String objectpath = "/" + "images" + "/" + entity + "/" + resolution + "/" + filename + "." + "png";
Path tmpFile = null;
try {
tmpFile = Files.createTempFile(imagesPath, "tmp_", ".png");
} catch (IOException e) {
e.printStackTrace();
}
tmpFile.toFile().deleteOnExit();
try {
ImageIO.write(bufferedImage, "png", tmpFile.toFile());
S3AsyncClient client = S3AsyncClient.builder().region(Region.of(region)).build();
CompletableFuture<PutObjectResponse> future =
client.putObject(PutObjectRequest.builder()
.bucket(bucket)
.key(objectpath)
.contentType("image/png")
.build(),
AsyncRequestProvider.fromFile(tmpFile.toAbsolutePath()));
Path finalTmpFile = tmpFile;
future.whenComplete((resp, err) -> {
try {
if (resp != null) {
logger.debug(resp.toString());
} else {
logger.error(err.toString());
}
Files.deleteIfExists(finalTmpFile.toAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
} finally {
FunctionalUtils.invokeSafely(client::close);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
Scaling
例程返回缩放后的 BufferedImage
,然后在 transferToS3
方法中使用。
public BufferedImage scale(int width, int height, BufferedImage bufferedImage) {
BufferedImage scaledBufferedImage = null;
if (bufferedImage != null) {
Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
scaledBufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
scaledBufferedImage.getGraphics().drawImage(image, 0, 0, null);
}
return scaledBufferedImage;
}
上面两个一起:
BufferedImage scaledBufferedImage = imageService.scale(width, height finalBufferedImage);
imageService.transferToS3(region, bucket, name, k, file, scaledBufferedImage);
最佳答案
您可以对请求中的数据流做任何您想做的事情。随意缩放内存中的图像并在响应中将其发回。您链接的示例将文件写入磁盘,因为这是迄今为止最常见的情况。它还允许作者专注于上传文件的细节,而不会用不相关的代码污染示例。
请注意,bufferedImage
不是文件。它是一个流。我怀疑作者将图像保存到磁盘是为了避免对图像的大小做出任何假设。如果图像太大而无法放入 RAM,那么您将难以在内存中进行缩放。
关于java - 为什么要通过先写入磁盘来将文件上传到 AWS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333973/
我是一名优秀的程序员,十分优秀!