CodingJavaJAX RS
Jersey (JAX-RS) single file upload example
Learn how to upload single file on server using Jersey (JAX-RS). Jersey provide @FormDataParam annotation for easy handle of multipart/form-data.
1 Min04 Apr, 2016

Jersey provide easy mechanism to let client upload file on server. In this tutorial we will learn single file upload to Jersey (JAX-RS) endpoint.

1. Include Jersey media multipart dependency in Gradle

File: build.gradle (snippet)

....
dependencies {
     compile 'org.springframework.boot:spring-boot-starter-web',
             'org.springframework.boot:spring-boot-starter-jersey',
             'org.glassfish.jersey.media:jersey-media-multipart:2.+', 
             'org.springframework.boot:spring-boot-starter-jdbc',
             'org.springframework.boot:spring-boot-devtools',    
             'com.h2database:h2:1.4.+'
             
    testCompile 'org.springframework.boot:spring-boot-starter-test'
}
....

Jersey provide multipart form data support using separate extension. We need to include that library as a dependency in application. Include 'org.glassfish.jersey.media:jersey-media-multipart:2.+' as compile time dependency.

2. HTML form with single file input

File: /src/main/resources/static/file-upload.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload File Test</title>
</head>
<body>
    <h2>Upload file</h2>
    <form action="/upload/file" enctype="multipart/form-data" method="post">
        <label>Select File</label><input type= "file" name="file" /> <br/><br/>
        <label>Tags</label> <input name="tags" maxlength="10"/> <br/><br/>
        <input type="submit" title="Save"/>
    </form>
</body>
</html>

A HTML form with multipart/form-data support with single file selection.

3. Use @FormDataParam injection

We can inject named multipart form values (File, binary, text etc.) using @FormDataParam, For e.g. form elements with name file and tags.

File: /src/main/java/in/geekmj/resource/FileUploadResource.java

package in.geekmj.resource;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.media.multipart.BodyPartEntity;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.springframework.stereotype.Component;

/*
 * 
 * @author geekmj Three ways to get Form data in Jersey
 */
@Path("/upload")

@Component
public class FileUploadResource {

    @Path("/file")
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(@DefaultValue("") @FormDataParam("tags") String tags, 
                @FormDataParam("file") InputStream file,
                @FormDataParam("file") FormDataContentDisposition fileDisposition) {

        String fileName = fileDisposition.getFileName();
        
        saveFile(file, fileName);
        
        String fileDetails = "File saved at /Volumes/Drive2/temp/file/" + fileName + " with tags "+ tags;

        System.out.println(fileDetails);

        return Response.ok(fileDetails).build();
    }
    
    private void saveFile(InputStream file, String name) {
        try {
            /* Change directory path */
            java.nio.file.Path path = FileSystems.getDefault().getPath("/Volumes/Drive2/temp/file/" + name); 
            /* Save InputStream as file */
            Files.copy(file, path);
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }

}

Using @FormDataParam we have injected input type file as InputStream and its FileDataContentDisposition. We have injected a text input field tags also.

4. Test single file upload

Download complete source code for this project and then follow this instruction to run the application.

Go to https://localhost:8080/file-upload.html

Single file upload to jersey endpoint Single file upload to jersey endpoint demo

References

  1. Official Jersey Documentation
  2. W3C multipartform/form-data documentation
  3. Jersey multipartform support extension maven repository
  4. InputStream
  5. Download the Full Project
  6. Follow Project On Github
Mrityunjay
© 2021, All Rights Reserved
Made In India 🇮🇳 with ❤️
Quick Links