中止从servlet上载以限制文件大小
时间:2020-03-06 14:58:17 来源:igfitidea点击:
我想限制可以上传到应用程序的文件的大小。为此,当要上传的文件大小超出限制时,我想从服务器端中止上传过程。
有没有一种方法可以在不等待HTTP请求完成的情况下中止服务器端的上传过程?
解决方案
我们可以尝试在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,就可以返回或者将错误消息返回给客户端。高温超导
我们可以执行以下操作(使用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; } }
我们可以使用apache commons fileupload库,该库也允许limir文件大小。
http://commons.apache.org/fileupload/