Abandon du téléchargement depuis un servlet pour limiter la taille du fichier
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?
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.