Jersey (JAX-RS) single file upload example

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.

This is a part of Jersey (JAX-RS) Restful Web Services Development Guides series. Please read Jersey + Spring Boot getting started guide.

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 http://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
Download Icon SmallDownload the Full ProjectGithub IconFollow Project On Github

Leave a Reply

Your email address will not be published. Required fields are marked *