Прерывание загрузки из сервлета для ограничения размера файла

Я хочу ограничить размер файла, который может быть загружен в приложение. Для этого я хотел бы прервать процесс загрузки на стороне сервера, когда размер загружаемого файла превышает предел.

Есть ли способ прервать процесс загрузки на стороне сервера, не дожидаясь завершения HTTP-запроса?


person Zizzencs    schedule 01.10.2008    source источник


Ответы (4)


Вы можете сделать что-то вроде этого (используя библиотеку 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;
        }
    }
person Drejc    schedule 01.10.2008
comment
Пожалуйста, взгляните на мой ответ, если вы используете JavaEE 6 / Servlet 3.0 - person Oleg Mikheev; 01.06.2013

В JavaEE 6 / Servlet 3.0 предпочтительный способ сделать это - использовать Аннотации @MultipartConfig на вашем сервлете, например:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class UploadFileServiceImpl extends HttpServlet ...
person Oleg Mikheev    schedule 31.05.2013
comment
Я не уверен, чего не хватает для того, чтобы это работало, но я с радостью могу загрузить 50 МБ, когда все ограничения установлены ниже 5 МБ. Мой пост: curl --request POST --data-binary @path/to/big.zip http://localhost:8080/endpoint. - person Giszmo; 26.01.2020

Вы можете попробовать сделать это в методе doPost () вашего сервлета.

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;
    }
}

Таким образом, вам не нужно ждать, чтобы полностью обработать HttpRequest, и вы можете вернуть или показать сообщение об ошибке на стороне клиента. HTH

person Nikhil Kashyap    schedule 01.10.2008

Вы можете использовать библиотеку загрузки файлов apache commons, эта библиотека также позволяет ограничивать размер файла.

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

person dcave555    schedule 01.10.2008