java - 如何将大输入流发送到 Spring REST 服务?

标签 java spring rest spring-mvc

有一个在嵌入式 Jetty 容器中运行的 Spring Rest 应用程序。 在客户端我使用 RestTemplate(尝试)。

用例:

有一个 InputStream(我没有文件),我想将它发送到 REST 服务。

InputStream 可能非常大(没有 byte[] !)。

到目前为止我尝试了什么:

StandardServletMultipartResolver 添加到 Dispatcher 上下文;

在执行 servlet 注册时:

ServletRegistration.Dynamic dispatcher = ...
MultipartConfigElement multipartConfigElement = new MultipartConfigElement("D:/temp");
dispatcher.setMultipartConfig(multipartConfigElement);

在客户端:

restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
        parts.add("attachmentData", new InputStreamResource(data) {
            // hacks ...
            @Override
            public String getFilename() {
                //avoid null file name
                return "attachment.zip";
            }

            @Override
            public long contentLength() throws IOException {
                // avoid calling getInputStream() twice
                return -1L;
            }
        }
ResponseEntity<Att> saved = restTemplate.postForEntity(url, parts, Att.class)

在服务器上:

    @RequestMapping("/attachment")
    public ResponseEntity<Att> saveAttachment(@RequestParam("attachmentData") javax.servlet.http.Part part) {
        try {
            InputStream is = part.getInputStream();
            // consume is
            is.close();
            part.delete();
            return new ResponseEntity<Att>(att, HttpStatus.CREATED);
        } 
    }

发生了什么: 上传的 InputStream 成功存储在配置的临时文件夹 (MultiPart1970755229517315824) 中,Part part 参数在处理程序方法中正确注入(inject)。

delete() 方法不会删除文件(smth 仍然有打开的句柄)。

反正看起来很丑。

有没有更流畅的解决方案?

最佳答案

您想使用 HTTP 的 Chunked Transfer Coding .您可以通过设置 SimpleClientHttpRequestFactory.setBufferRequestBody(false) 来启用它.参见 SPR-7909 .

关于java - 如何将大输入流发送到 Spring REST 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145610/

相关文章:

java - Glassfish 中的 ResteasyProviderFactory 异常

java - 如何格式化从rest api生成的json输出

java - JTable 仅以编程方式排序

java - 如何返回JSON格式的信息

java - 以编程方式导入 C/C++ 项目 eclipse

spring - java.lang.NoClassDefFoundError : org/hibernate/engine/SessionFactoryImplementor from Spring 3. 1.2/Hibernate 4.1.7 和 Shards 3.0.0.Beta2

java - 在 Spring Boot 中找不到符号(所有构造函数、getter 和 setter)

google-app-engine - 关于在谷歌应用引擎中将 eve 用于 python 框架

java - Android 抽屉导航 fragment

java - 订单 Activity 因空点引用而崩溃