使用MultipartConfig的Java Servlets

4

我正在使用一个全捕获的servlet,并将请求对象传递给其他内部框架类。这是我的应用程序设计方式。原因超出了本问题的范围。

@WebServlet(name="RequestHandler", urlPatterns="/*")

我正在尝试使用multipart-form-data从浏览器上传文件:

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" name="videoUpload" value="Upload"/>
</form>

唯一将文件数据传递到服务器的方法是使用以下注释对servlet进行注释:

@MultipartConfig

如果我为我的全捕获Servlet添加注释,那么一切都能正常工作,但我实际上很少需要使用文件上传功能。

选项1:不做任何更改。 即使大多数请求不使用它,保留注释是否会导致不必要的开销?

选项2:通过编程添加? 如果检测到multipart表单类型,是否有一种通过编程添加注释的方法?

选项3:在其他地方使用注释。 将注释放在另一个类中怎么样(我假设它需要在请求对象实际创建之前存在...)?

1个回答

1
即使您不添加“@MultipartConfig”注释也可以。您可以通过编程确定内容是否为多部分:
 String form_field="";
 FileItem fileItem = null; 
 if (ServletFileUpload.isMultipartContent(request)) {
            ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
            try {
                fileItemsList = servletFileUpload.parseRequest(request);
            } catch (FileUploadException ex) {
                out.print(ex);
            }
            String optionalFileName = "";
            Iterator it = fileItemsList.iterator();
            while (it.hasNext()) {
                FileItem fileItemTemp = (FileItem) it.next();
                if (fileItemTemp.isFormField()) {
                    if (fileItemTemp.getFieldName().equals("form_field")) {
                        form_field = fileItemTemp.getString();
                    }
                } else {
                    if (fileItemTemp.getFieldName().equals("file")) {
                        fileItem = fileItemTemp;
                    }
                }
            }
        }

如果ServletFileUpload.isMultipartContent(request)为false,则可以通过request.getParameter以一般方式检索表单参数。在示例中,我使用了apache file upload

另一个选择是使用过滤器来确定请求是否为多部分,以避免使servlet混乱并不得不重新发布代码。我从@BalusC那里找到了一个有用的资源http://balusc.blogspot.com/2009/12/uploading-files-in-servlet-30.html。 - ryandlf

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