java - prácticos - jsp pdf
Abortar la carga de un servlet para limitar el tamaño del archivo (4)
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
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 servidor sin esperar a que termine la solicitud HTTP?
Puede usar la biblioteca de carga de archivos de apache commons, esta biblioteca también permite el tamaño de archivos limir.
Puedes hacer algo como esto (usando la biblioteca de 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;
}
}
Con JavaEE 6 / Servlet 3.0, la forma preferida de hacerlo sería usar la anotación @MultipartConfig en su servlet de esta manera:
@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class UploadFileServiceImpl extends HttpServlet ...