Question

J'aimerais limiter la taille du fichier pouvant être chargé dans une application. Pour ce faire, j'aimerais interrompre le processus de téléchargement côté serveur lorsque la taille du fichier en cours de téléchargement dépasse une limite.

Y a-t-il un moyen d'abandonner un processus de téléchargement côté serveur sans attendre que la requête HTTP se termine?

Était-ce utile?

La solution

Vous pouvez faire quelque chose comme ceci (en utilisant la bibliothèque 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;
        }
    }

Autres conseils

Avec JavaEE 6 / Servlet 3.0, le moyen préféré consiste à utiliser annotation @ MultipartConfig sur votre servlet, comme suit:

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

Vous pouvez essayer ceci dans la méthode doPost () de votre 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 cette manière, vous n’avez pas à attendre pour traiter complètement votre requête HttpRequest et pouvez renvoyer ou afficher un message d’erreur au côté client. HTH

Vous pouvez utiliser la bibliothèque filachepload d’apache commons, cette bibliothèque permet également de limiter la taille du fichier.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top