 <p>There is no problem in your code, but the problem in client request, because Content-Type should be like below if you want to upload image,</p> <pre><code>multipart/form-data; boundary="123123" </code></pre> <p>try to remove the Content-Type header and test, i will put one example for server code and client request</p> <p>Server code:</p> <pre><code>@RequestMapping(method = RequestMethod.POST, value = "/users/profile") public ResponseEntity&lt;?&gt; handleFileUpload(@RequestParam("name") String name, @RequestParam(name="file", required=false) MultipartFile file) { log.info(" name : {}", name); if(file!=null) { log.info("image : {}", file.getOriginalFilename()); log.info("image content type : {}", file.getContentType()); } return new ResponseEntity&lt;String&gt;("Uploaded",HttpStatus.OK); } </code></pre> <p>Client Request using Postman</p> <p>with image <a href="https://i.stack.imgur.com/CnHoV.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/CnHoV.png" alt="enter image description here"></a></p> <p>without image</p> <p><a href="https://i.stack.imgur.com/UVE1t.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/UVE1t.png" alt="enter image description here"></a></p> <p>Curl example:</p> <p>without image, with Content-Type</p> <pre><code>curl -X POST -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "name=test" "http://localhost:8080/api/users/profile" </code></pre> <p>without image, without Content-Type</p> <pre><code>curl -X POST -F "name=test" "http://localhost:8080/api/users/profile" </code></pre>