我正在使用一个catch-all 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
如果我注释我的catch-all servlet,一切正常,但实际上并不经常需要使用文件上传功能。
选项1:不管它。 即使大部分请求都不使用注释,是否会留下不必要的开销?
选项2:以编程方式添加它? 如果检测到多部分的表单类型,有没有办法以编程方式添加注释?
选项3:在其他地方使用注释。 如何在单独的类中使用注释(我假设它在实际创建请求对象之前需要存在...)?
答案 0 :(得分: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。