Interruzione del caricamento da un servlet per limitare le dimensioni del file
Domanda
Vorrei limitare la dimensione del file che può essere caricato su un'applicazione. A tal fine, desidero interrompere il processo di caricamento dal lato server quando la dimensione del file da caricare supera un limite.
Esiste un modo per interrompere un processo di caricamento dal lato server senza attendere il completamento della richiesta HTTP?
Soluzione
Puoi fare qualcosa del genere (usando la 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;
}
}
Altri suggerimenti
Con JavaEE 6 / Servlet 3.0 il modo preferito per farlo sarebbe usare @ annotazione MultipartConfig sul tuo servlet in questo modo:
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class UploadFileServiceImpl extends HttpServlet ...
Potresti provare a farlo nel metodo doPost () del tuo 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;
}
}
In questo modo non devi aspettare per elaborare completamente il tuo HttpRequest e puoi restituire o mostrare un messaggio di errore sul lato client. HTH
Puoi usare la libreria di fileupload di commons apache, questa libreria permette di limitare anche la dimensione del file.