One thing to note is Angular automatically sets the multipart mime type and boundary on the 'Content-Type' header value for me. Yours may not, in which case you need to set it yourself.
My application expects a JSON response from the server, thus the 'Accept' header.
You are passing in the FormData object yourself, so you need to make sure that your form is setting the File to whatever attribute you map to on your Controller. In my case it is mapped to the 'file' parameter on the FormData object.
My controller endpoints look like this:
@POST
@RequestMapping("/upload")
public ResponseEntity
You can add as many other @RequestParam as you'd like, including your DTO that represents the rest of the form, just make sure its structured that way as a child of the FormData object.
The key take-away here is that each @RequestParam is an attribute on the FormData object body payload on the multipart request.
If I were to modify my code to accommodate your data, it would look something like this: