2008-10-01 10 views
4

Je souhaite limiter la taille du fichier pouvant être téléchargé vers une application. Pour ce faire, je souhaite abandonner le processus de téléchargement du côté serveur lorsque la taille du fichier en cours de téléchargement dépasse une limite.Annulation du téléchargement depuis une servlet pour limiter la taille du fichier

Existe-t-il un moyen d'interrompre un processus de téléchargement du côté du serveur sans attendre la fin de la requête HTTP?

Répondre

2

Vous pouvez faire quelque chose comme ça (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; 
     } 
    } 
+0

Pls un coup d'oeil à ma réponse si vous êtes sur JavaEE 6/Servlet 3.0 –

1

Vous pouvez essayer de le faire 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 façon, vous ne devez pas attendre pour traiter complètement votre HttpRequest et peut retourner ou afficher un message d'erreur à la côté client. HTH

3

Avec JavaEE 6/Servlet 3.0 le meilleur moyen de le faire serait d'utiliser le @MultipartConfig annotation sur votre servlet comme ceci:

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