从Servlet中断上传以限制文件大小

5
我想限制应用程序上传的文件大小。为了达到这个目的,当上传的文件大小超过限制时,我希望能够从服务器端终止上传过程。是否有一种方法可以在不等待HTTP请求完成的情况下从服务器端中止上传过程?
4个回答

3

使用JavaEE 6 / Servlet 3.0,做这件事的首选方法是在您的servlet上使用@MultipartConfig注释,如下所示:

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

我不确定这个程序需要什么才能正常工作,但当所有限制都设置在5MB以下时,我可以愉快地上传50MB。我的帖子:curl --request POST --data-binary @path/to/big.zip http://localhost:8080/endpoint - Giszmo

2
你可以像这样做(使用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;
        }
    }

如果您正在使用JavaEE 6 / Servlet 3.0,请查看我的答案。 - Oleg Mikheev

1

1
你可以尝试在你的servlet的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,可以立即返回或向客户端显示错误消息。希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接