File upload feature of html form works by wrapping the file content inside amultipart envelope as the content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.
-   
RESOLVE DEPENDENCY
For the "multipart/form-data" support we need to include "jersey-multipart.jar" and dependencies from here [for glassfish v3.1 & upward you will find it in glassfish\modules]. <html><body><h1>Upload File with RESTFul WebService</h1><formaction="rest/fileupload"method="post"enctype="multipart/form-data"><p>Choose a file : <inputtype="file"name="file"/></p><inputtype="submit"value="Upload"/></form></body></html>
JAVA FILE UPLOAD CLIENTWe will use Apache HTTPClient library to resolve dependency. It is an optional step & the code could be exploited to build a test-client.HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
FileBody fileContent= new FileBody(new File(fileName));
StringBody comment = new StringBody("Filename: " + fileName);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("file", fileContent);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
-   
CREATE JAX-RS FILE UPLOAD SERVICE WITH JERSEY
 - jersey uses @FormDataParam to receive the uploaded file. to get the uploaded file name or header detail, compare with "
FormDataContentDisposition" which represents a "content-disposition" header whose value is "form-data". 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;
@Path("/fileupload")
public class UploadFileService {
    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {
        String uploadedFileLocation = "c://uploadedFiles/" + fileDetail.getFileName();
        // save it
        saveToFile(uploadedInputStream, uploadedFileLocation);
        String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;
        return Response.status(200).entity(output).build();
    }
    // save uploaded file to new location
    private void saveToFile(InputStream uploadedInputStream,
        String uploadedFileLocation) {
        try {
            OutputStream out = null;
            int read = 0;
            byte[] bytes = new byte[1024];
            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
TEST YOUR SERVICE
Deploy & Browse to {App_URL}/{File_Upload_html}
Upload A file and check.
No comments:
Post a Comment