Pregunta

Me gustaría limitar el tamaño del archivo que se puede cargar a una aplicación. Para lograr esto, me gustaría abortar el proceso de carga desde el lado del servidor cuando el tamaño del archivo que se está cargando supera un límite.

¿Hay alguna forma de abortar un proceso de carga desde el lado del servidor sin esperar a que finalice la solicitud HTTP?

¿Fue útil?

Solución

Puede hacer algo como esto (utilizando la Commons ):

    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;
        }
    }

Otros consejos

Con JavaEE 6 / Servlet 3.0, la forma preferida de hacerlo sería utilizar @ MultipartConfig anotación en tu servlet como esto:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class UploadFileServiceImpl extends HttpServlet ...

Puede intentar hacer esto en el método doPost () de su 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;
    }
}

De esta manera, no tiene que esperar para procesar completamente su HttpRequest y puede devolver o mostrar un mensaje de error al lado del cliente. HTH

Puede usar la biblioteca de apache commons fileupload, esta biblioteca también permite limitar el tamaño del archivo.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top