有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用SpringMVC的java流式处理大型文件

我正在尝试创建一个下载和上传大文件的应用程序,所以我不希望文件内容存储在内存中

在mvc控制器端,我使用了一个http消息转换器,它可以转换为InputStream,也可以转换为InputStream

@Override
public InputStream read(Class<? extends InputStream> clazz, HttpInputMessage inputMessage) throws IOException,
        HttpMessageNotReadableException {
    return inputMessage.getBody();
}

@Override
public void write(InputStream t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException,
        HttpMessageNotWritableException {

    try {
        IOUtils.copy(t, outputMessage.getBody());
    } finally {
        IOUtils.closeQuietly(t);
    }
}

这在服务器端运行良好

在客户端(RestTemplate),我尝试使用相同的转换器,但我得到一个异常,流已经关闭(可能在请求完成时关闭)

客户端代码:

ResponseEntity<InputStream> res = rest.getForEntity(url, InputStream.class);
// res.getBody() is closed

我还尝试将输入流复制到缓冲区中,创建一个新的ByteArrayInputStream并将其返回到RestTemplate客户端,它工作得很好,但是它确实需要将数据读入内存,这不符合我的要求

我的问题是如何在处理流之前保持流的打开状态,而不必将其全部读入内存/文件

任何想法都将不胜感激

你好,谢伊


共 (2) 个答案

  1. # 1 楼答案

    据我所知,RestTemplate的getForEntity()不是获取InputStream的合适方法。它方便了实体类之间的转换,所以这大概就是问题所在

    既然您已经习惯了HttpInputMessage,为什么不使用HttpInputMessage呢。客户端上的getBody()也是吗?它为您提供了一个很好的InputStream,可以直接传递到输出流,比如HttpServletResponse。getOutputStream()

  2. # 2 楼答案

    检查SpringMVC如何使用org处理大型文件上传。springframework。网状物多部分。平民公共多部分解析器。它有一个“maxInMemorySize”,可以帮助控制内存需求。有关在REST模板Sending Multipart File as POST parameters with RestTemplate requests中使用多部分解析器的信息,请参阅此线程