Search code examples
jax-rsresteasy

How do I do a multipart/form file upload with jax-rs?


(specifically RESTeasy)

It would be nice (for a single file) to have a method signature like:

public void upload(@FormParam("name") ..., @FormParam("file") file: InputStream)
... 

doable? or am I dreaming? doesn't seem to be that simple.


Solution

  • The key is to leverage the @MultipartForm annotations that comes with RESTEasy. This enables you to define a POJO that contains all the parts of the form and bind it easily.

    Take for example the following POJO:

    public class FileUploadForm {
        private byte[] filedata;
    
        public FileUploadForm() {}
    
        public byte[] getFileData() {
            return filedata;
        }
    
        @FormParam("filedata")
        @PartType("application/octet-stream")
        public void setFileData(final byte[] filedata) {
            this.filedata = filedata;
        }
    }
    

    Now all you need to do is use this POJO in the entity which would look something like this:

    @POST
    @Path("/upload")
    @Consumes("multipart/form-data")
    public Response create(@MultipartForm FileUploadForm form) 
    {
        // Do something with your filedata here
    }