【问题标题】:Spring boot Multipart file upload using Client Side Java CodeSpring boot 使用客户端 Java 代码上传多部分文件
【发布时间】:2017-02-09 19:25:02
【问题描述】:

我在 Spring Boot 中编写了一个用于接收文件的 RESTful Web 服务。

@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public void uploadFile(@RequestParam("file") MultipartFile uploadfile) {
    System.out.println("filename: " + uploadfile.getName());
}

我们如何将文件从客户端 java 代码上传到 Web 服务。而不是 AJAX 调用或 HTML 页面表单多部分请求?

以下代码使用 JSON 对象调用 Web 服务。像这样我想在上面写的网络服务中接收文件。

void clientRequest(String server_url, JSONObject fileObj){

  try {

    URL url = new URL(server_url);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/json");

    OutputStream os = conn.getOutputStream();
    os.write(fileObj.toString().getBytes());
    os.flush();

    BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        logger.info("output :: " + output);
    }

    conn.disconnect();

  } catch (Exception e) {
    e.printStackTrace();
  }
}

【问题讨论】:

    标签: java spring spring-mvc multipart


    【解决方案1】:

    你可以使用Spring的HttpEntityByteArrayResource来上传文件,这里是一个例子:

    MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>();
    ByteArrayResource resource = new ByteArrayResource(file.getBytes()) {
        @Override
        public String getFilename() {
            return file.getName();
        }
    };
    data.add("file", resource);
    
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
    
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data, requestHeaders);
    
    final ResponseEntity<<SomeClass>> responseEntity = restTemplate.exchange(<url>, 
            HttpMethod.POST, requestEntity, new ParameterizedTypeReference<SomeClass>(){});
    
    SomeClass result = responseEntity.getBody();
    

    【讨论】:

      【解决方案2】:

      如果您想使用MultipartFile,您必须在请求时使用multipart/form-data mimetype。您应该构造一个特定的多部分实体,其中包含单个字段 file,而不是将 JSON 作为请求实体发送。

      它是这样完成的:How can I make a multipart/form-data POST request using Java?

      【讨论】:

      • 链接中给出的代码不起作用。我已经厌倦了它。它的大部分方法都已弃用。
      • 代码包含http-client的4.3版本的更新答案。
      • 谢谢,我累了 http-client 4.3 它早点工作它不工作
      • 我们如何将 JSONObject 连同文件一起发送到 Web 服务
      • 您可以将 JSON 作为第二个多部分表单字段包含在另一个字段名称中。您将在 REST 控制器中获得第二个 @RequestParam。只需通过ObjectMapper 拉出该文件流。因为您使用的是多部分里程类型,所以不能使用 @RequestBody 将 JSON 转换为 POJO。如果您要与文件合并的 JSON 数据非常简单,请考虑将数据展平并将其包含为单独的表单字段,其中包含属性值而不是文件...
      猜你喜欢
      • 2017-08-21
      • 1970-01-01
      • 2014-10-31
      • 2014-05-01
      • 2021-08-22
      • 1970-01-01
      • 2019-06-24
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多