Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要先通过写入磁盘将文件上载到AWS?_Java_Amazon Web Services_Amazon S3 - Fatal编程技术网

Java 为什么要先通过写入磁盘将文件上载到AWS?

Java 为什么要先通过写入磁盘将文件上载到AWS?,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,本例使用的文件很可能不在RAM中: 但是我已经从某个客户端请求中获得了一个缓冲文件,在下面的代码中,这个文件被写入磁盘,但是为什么?写入磁盘会使整个过程变慢,我能避免吗 编辑(以下是我试图实现的目标的解释): 用户的图像被上传,然后由服务器缩放,然后保存在服务器的磁盘上,只有在该缩放图像被发送到AWS之后,用户才能获得图像位于amazon服务器上的AWS链接 public void transferToS3(String region, String bucket, String entity

本例使用的文件很可能不在RAM中:

但是我已经从某个客户端请求中获得了一个缓冲文件,在下面的代码中,这个文件被写入磁盘,但是为什么?写入磁盘会使整个过程变慢,我能避免吗

编辑(以下是我试图实现的目标的解释):

用户的图像被上传,然后由服务器缩放,然后保存在服务器的磁盘上,只有在该缩放图像被发送到AWS之后,用户才能获得图像位于amazon服务器上的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();
        }
    }
上述两个因素加在一起:

BufferedImage scaledBufferedImage = imageService.scale(width, height finalBufferedImage);
imageService.transferToS3(region, bucket, name, k, file, scaledBufferedImage);

您可以对来自请求的数据流执行任何操作。您可以随意缩放内存中的图像,并在响应中将其发送回。您链接的示例将文件写入磁盘,因为这是目前最常见的情况。它还允许作者专注于上传文件的细节,而不会用不相关的代码污染示例


请注意,
bufferedImage
不是文件。这是一条小溪。我怀疑作者将图像保存到磁盘是为了避免假设图像的大小。如果图像太大,无法放入RAM,则在内存中进行缩放时会遇到困难。

如果文件比堆大,会发生什么情况?要如何处理插入的文件?然后如何处理?是否立即返回缩放后的图像?如果您可以在内存中进行缩放,那么不,您不需要将文件写入磁盘。这里给出的哪行代码可以进行缩放?我正在尝试提高速度,因为有时候我感觉速度变慢了,并且假设映像小于300kb,那么避免磁盘操作可能是合理的?@Oleg disk access很少会成为网络操作的瓶颈。
BufferedImage scaledBufferedImage = imageService.scale(width, height finalBufferedImage);
imageService.transferToS3(region, bucket, name, k, file, scaledBufferedImage);