【问题标题】:Is it necessary to use bufferInputStream when getting a file from Minio?从Minio获取文件时是否需要使用bufferInputStream?
【发布时间】:2018-04-11 13:09:15
【问题描述】:

我想知道当我从 Minio 接收到输入流时是否需要缓冲区。

我使用 Minio 作为我的对象存储,并将 Dropwizard 作为客户端和 Minio 之间的后端。现在,当我使用 minio 中的 getObject 方法时,我得到了一个 inputStream。

public InputStream getObject(String bucketName, String objectName, long offset)

在我看来,它会像

@Path("/file")
public class FileResource {

    @GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getFile() throws Exception {
        InputStream is = minioClient.getObject("mybucket", "myobject");

        return Response.ok(is)
                .header(HttpHeaders.CONTENT_DISPOSITION, 
                        "attachment; filename=\"file.txt\"")
                .build();
    }
}

据我了解,可以仅将此输入流作为对具有必要内容处置的客户端的响应返回。

现在需要缓冲输入流吗?以及 GET 请求要等多久才会超时?

【问题讨论】:

    标签: java rest dropwizard minio


    【解决方案1】:

    我无权访问 Minio。但是使用简单的本地文件,您的方法就可以正常工作。

    import com.google.common.net.HttpHeaders;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.nio.file.Paths;
    import javax.ws.rs.GET;
    import javax.ws.rs.InternalServerErrorException;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    @Path("/file")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public class FileResource {
    
        @GET
        public Response getFile() {
            try {
                InputStream is = new FileInputStream(Paths.get("/tmp/foo.txt").toFile());
                return Response.ok(is)
                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"file.txt\"")
                        .build();
            } catch (FileNotFoundException ex) {
                throw new InternalServerErrorException(ex.getMessage());
            }
    
        }
    }
    

    返回一个包含一些文本的简单文件/tmp/foo.txt,并带有正确的 HTTP 响应。使用curl

    $ curl -v http://localhost:8080/file
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 8080 (#0)
    > GET /file HTTP/1.1
    > Host: localhost:8080
    > User-Agent: curl/7.47.0
    > Accept: */*
    > 
    < HTTP/1.1 200 OK
    < Date: Wed, 11 Apr 2018 14:15:06 GMT
    < Content-Disposition: attachment; filename="file.txt"
    < Content-Type: application/octet-stream
    < Vary: Accept-Encoding
    < Content-Length: 12
    < 
    foo
    bar
    baz
    

    【讨论】:

    • 丹克,卢茨。所以如果我使用这个建议的方法。 inputStream 是如何处理的?使用 Dropwizard 库是内存中的文件或文件流打开,直到整个文件被传输。
    • 我不知道确切的细节。将InputStream 传递给ok(Object) 是一种受支持的方式。这不是 Dropwizard 特有的,而是由 JAX-RS 和 Jersey 处理的。
    • 再次感谢。我的最后一个问题是在请求大文件时是否会发生超时?
    • minioClient.getObject 的文档对此有何评论?这个方法在超时的情况下会抛出异常吗?
    • minioClient.getObject 会抛出典型的异常,例如NoResponseException。我担心的是当我进行 REST GET 调用时,我的 Dropwizard 后端由于检索到输入流而超时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多