2017-02-09 52 views
2

我在Spring引導中寫了一個寧靜的web服務,它接收文件。Spring引導使用客戶端Java代碼上傳多部分文件

@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(); 
    } 
} 

回答

0

如果你想使用MultipartFile,你必須在請求時所使用的MIME類型multipart/form-data。代替將JSON作爲請求實體發送,您應該構建一個特定的多部分實體,其中包含一個字段file

這是它是如何做:How can I make a multipart/form-data POST request using Java?

+0

代碼中的鏈接給不工作。我已經厭倦了它。它的大部分方法都被棄用了。 –

+0

該代碼包含4.3版本「http-client」的更新答案。 –

+0

謝謝我厭倦了HTTP客戶端4.3它工作得更早它不起作用 –

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();