Usually for file upload I've used multipart/form-data & it worked fine. But now there is a requirement for my server to be able to accept files application/octet-stream.
On the server side I have:
@ResponseBody
@RequestMapping(path = "/mock",
        consumes = { MediaType.APPLICATION_OCTET_STREAM_VALUE },
        method = RequestMethod.POST)
public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) {
    return ResponseEntity.accepted().build();
}
And I'm trying to test it with curl:
curl -v -H "Content-Type:application/octet-stream" \
  --data-binary @/home/user/Desktop/test.txt http://localhost:9090/mock
As a result a have:
org.springframework.web.multipart.MultipartException: Current request is not a multipart request
I've noticed that "file" part is not specified in my curl command but expected on the server side. It's not clear where to move next & what is broken test command or server or both.
As you don't have a multipart form-data message you can't use a MultipartFile.
You now have two possibilties.
Either send a multipart message with curl:
(Have a look at the form data called file.)
curl -F "file=@/home/user/Desktop/test.txt" http://localhost:9090/mock
Or change the controller:
@ResponseBody
@RequestMapping(path = "/mock",
        consumes = { MediaType.APPLICATION_OCTET_STREAM_VALUE },
        method = RequestMethod.POST)
public ResponseEntity handleFileUpload(final HttpServletRequest request) {
    // request.getInputStream() will contain the content of the posted file
    return ResponseEntity.accepted().build();
}
to upload files in the multipart/form-data-format, use -F or --form
curl -F "file=@/home/user/Desktop/test.txt" http://localhost:9090/mock
but that will probably send the file as Content-Type: text/plain , not Content-Type: application/octet-stream, as we can see in a netcat server: 
$ nc -l 9090
POST /mock HTTP/1.1
Host: 127.0.0.1:9090
User-Agent: curl/7.66.0
Accept: */*
Content-Length: 190
Content-Type: multipart/form-data; boundary=------------------------465160a3b9f7de24
--------------------------465160a3b9f7de24
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
lol
--------------------------465160a3b9f7de24--
in order to force curl to send it as application/octet-stream , do -F "file=@/home/user/Desktop/test.txt;type=application/octet-stream"
which gives us:
$ nc -l 9090
POST /mock HTTP/1.1
Host: 127.0.0.1:9090
User-Agent: curl/7.66.0
Accept: */*
Content-Length: 204
Content-Type: multipart/form-data; boundary=------------------------444e61e5527966d1
--------------------------444e61e5527966d1
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: application/octet-stream
lol
--------------------------444e61e5527966d1--
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With