Skip to main content

JEE File Upload - Handling Multipart requests in Servlets 3.0

Prior to Servlets 3.0 developers have to use 3rd party libraries to process complex multipart request that is sent when file is uploaded by user. Starting from Servlets 3.0 JEE provides a better way to handle file uploads (multipart requests) without using any 3rd party library.

Making your Servlet ready to handle Multipart requests
All you have to do is to add @MultipartConfig annotation on your servlet class and it is ready to handle Multipart requests.
@MultipartConfig 
public class FileUploadServlet extends HttpServlet {
Our example HTML form
<form method="POST" enctype="multipart/form-data">
<input type="file" name="ufile" />
<input type="submit" value="Submit" />
</form>
Handling the POST in processRequest method of Servlet
protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
Getting the uploaded file Part
To extract the uploaded file we will use getPart method of HttpServletRequest. getPart method returns a part from multipart request specified by name passed as parameter to it.
Part filePart = request.getPart("ufile");
Getting file name of uploaded file
Even though we have now support in servlets to handle Multipart request we have to do some extra processing to get the file name and other things from the Part. We will make a helper function that will return the filename passed from client's browser to our server in the <input type=file> object.
//Content-Disposition for uploaded file has following format
//form-data; name="ufile"; filename="name.txt"
private String getFileName(final Part part) {
    final String partHeader = part.getHeader("content-disposition");
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename")) {
            return content.substring(
                    content.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}
We will call the helper function like this
final String fileName = getFileName(filePart);
//we will construct the path to save the file.
//Right now I am making dummy path for simplicity
String filePath="D:\\"+fileName;
Reading from uploaded file Stream and writing to local file
As standard in Java we will need OutputStream of file where we will store our uploaded file and InputStream for uploaded file. Part class has a method getInputStream() that returns the InputStream to read the bytes/data of that Part.
InputStream filecontent = filePart.getInputStream();
OutputStream fileOut = new FileOutputStream(new File(filePath));
Start reading from InputStream and write to OutputStream
int read = 0;
final byte[] bytes = new byte[1024];
while ((read = filecontent.read(bytes,0,1024)) != -1) {
    out.write(bytes, 0, read);
}
Closing the streams
if (out != null) {
    out.close();
}
if (filecontent != null) {
    filecontent.close();
}

Comments

Popular posts from this blog

Decoding JPEG image file using libavcodec

I got a chance to work on a video encoding application that decodes series of jpeg files and convert them into ogg theora video file. I used the infamous libavcodec library that is used in FFMPEG . I decided to write blog posts explaining how I decode jpeg images and convert them into ogg video file. This is the first part and in this I will explain how to decode jpeg images using libavcodec. To learn how to write decoded images as a ogg video file please read http://random-stuff-mine.blogspot.com/2017/07/encoding-raw-images-to-ogg-theora-video.html Before reading this blog post you must be aware of using and setting up libavcodec. I highly recommend this tutorial to get basics of using libavcodec http://www.ffmpeg.org/doxygen/0.6/api-example_8c-source.html Allocating input format context We will first allocate input format for reading the file. We will use avformat_open_input function that will allocate AVFormatContext structure passed to it , the function detects input typ

CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information

I created a new Blazor Server app in Visual Studio 2019 and tried to run it. But I was getting this error CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. I couldn't find any reason or solution to this problem. I tried creating the project multiple times but same error. I created a new .Net Core Web App and added a new razor component and included that component in a razor page (cshtml file) like this @(await Html.RenderComponentAsync<GeofenceWork>(RenderMode.ServerPrerendered)) and <component type="typeof(GeofenceWork)" render-mode="serverprerendered" /> As soon as I navigate to this page that has component added I got the same error: CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. This was very frustrating. After hours of trying and searching I figured out the solution. 

Encoding raw images to Ogg Theora video using libavcodec

In one of the blog posts we learned how to decode jpeg images using libavcodec. This is the second part of that post. In this we will learn how to encode decoded images (raw images) to theora and write them in ogg video file. In the end of the first part we saved our raw image in raw_data variable and its length in raw_data_size variable. Lets assume that we packaged all our decoding code in one function called "decode_jpeg_image" which has following signature int decode_jpeg_image(char *filename,int file_name_size,uint8_t *raw_data,int *raw_data_size) filename = name of jpeg file to decode file_name_size = length of jpeg file's name raw_data = contains decoded raw image on return raw_data_size = contains length of raw_data on return Now let's start working on how to encode this image in raw_data to theora and write that image to ogg video file. Finding Theora encoder We first have to find encoder for THEORA which is represented by AVCodec structure. He