如何将输入流添加到多部分http请求? (Java Spring)

时间:2015-10-15 13:42:02

标签: java spring multipart resttemplate spring-restcontroller

我正在使用Spring 4的其余控制器创建一个REST服务,并使用Spring的RestTemplate进行测试。

我想接受创建新文件(POST)的请求。

我系统中文件的概念包含两部分 - (1)元数据,(2)内容。因此,我已将我的rest控制器定义为接受MultipartHttpServletRequest。我想从第二部分中提取元数据映射,从第二部分提取文件输入流,但我不确定如何使其工作。

请求中的输入流而不是整个文件很重要,因为文件可能非常大,我不想通过让用户发送带有所有文件数据的巨大http请求来强调网络。

下面我有一个非工作的实现我的rest控制器方法和我用来发送测试Http请求的测试。当我运行以下代码时,我得到500服务器错误异常,因为我认为该请求与我如何配置RestController无法正确匹配。

我已经尝试在控制器中创建@RequestParam的通用对象而不是Map和InputStream。这将在没有500异常的情况下运行,但随后对象被解释为字符串,这不是我想要的(这对于处理元数据是可以的,但我想要一个文件的InputStream!)。

创建请求:

public void createAndSendRequest() throws IOException {
   MultiValueMap<String,Object> requestMap = new LinkedMultiValueMap<String, Object>();
   url = "http:/my.domain/someService/document";
   method = HttpMethod.POST;
   returnType = String.class;

   // add metadata to the request
   Map<String, String> metadata = new HashMap<>();
   metadata.put("somedata1", "alpha");
   metadata.put("somedata2", "beta");
   metadata.put("somedata3", "gamma");
   requestMap.add("metadata", metadata);

   // add the file to the request (as a stream?)
   URL fileUrl = this.getClass().getClassLoader().getResource("test.txt");
   File file = new File(fileUrl.getFile());
   InputStream stream = new FileInputStream(file);
   InputStreamResource resource = new InputStreamResource(stream);
   requestMap.add("file", resource);

   response = restTemplate.exchange(url, method, new HttpEntity<Object>(requestMap, headers), returnType);
   handleResponse(response);
}

Rest Controller方法来处理请求:

    @RequestMapping(value = "/document", method = RequestMethod.POST)
    public ResponseEntity<String> createDocument(MultipartHttpServletRequest request,
                @RequestParam("file") InputStream fileStream,
                @RequestParam("metadata") Map metadata) throws Exception {

       // do some file stream work
       int ch;
       ch = fileStream.read();
       while (ch != -1) {
           System.out.println((char) ch);
           ch = fileStream.read();
       }

       // do application stuff

       return new ResponseEntity(HttpStatus.CREATED);
    }

0 个答案:

没有答案