views:

506

answers:

3

I'd like to limit the size of the file that can be uploaded to an application. To achieve this, I'd like to abort the upload process from the server side when the size of the file being uploaded exceeds a limit.

Is there a way to abort an upload process from the server side without waiting the HTTP request to finish?

+1  A: 

You might try doing this in the doPost() method of your servlet

multi = new MultipartRequest(request, dirName, FILE_SIZE_LIMIT); 

if(submitButton.equals(multi.getParameter("Submit")))
{
    out.println("Files:");
    Enumeration files = multi.getFileNames();
    while (files.hasMoreElements()) {
    String name = (String)files.nextElement();
    String filename = multi.getFilesystemName(name);
    String type = multi.getContentType(name);
    File f = multi.getFile(name);
    if (f.length() > FILE_SIZE_LIMIT)
    {
     //show error message or
     //return;
     return;
    }
}

This way you don't have to wait to completely process your HttpRequest and can return or show an error message back to the client side. HTH

Nikhil Kashyap
+2  A: 

You can do something like this (using the Commons library):

    public class UploadFileServiceImpl extends HttpServlet
    {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException
        {
         response.setContentType("text/plain");

         try
         {
          FileItem uploadItem = getFileItem(request);
          if (uploadItem == null)
          {
                     // ERROR
          } 

          // Add logic here
         }
         catch (Exception ex)
         {
          response.getWriter().write("Error: file upload failure: " + ex.getMessage());   
         }
        }

        private FileItem getFileItem(HttpServletRequest request) throws FileUploadException
        {
         DiskFileItemFactory factory = new DiskFileItemFactory();  

             // Add here your own limit      
             factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);

      ServletFileUpload upload = new ServletFileUpload(factory);

             // Add here your own limit
             upload.setSizeMax(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);


         List<?> items = upload.parseRequest(request);
         Iterator<?> it = items.iterator();
         while (it.hasNext())
         {
          FileItem item = (FileItem) it.next();
                        // Search here for file item
          if (!item.isFormField() && 
            // Check field name to get to file item  ... 
          {
           return item;
          }
         }

         return null;
        }
    }
Drejc
+1  A: 

You can use apache commons fileupload library, this library permits to limir file size also.

http://commons.apache.org/fileupload/

dcave555