我终于弄清楚了。 Commons-文件上传方法parseRequest(httpServletRequest)
尝试读取请求的输入流。由于容器已经读取它,因此它是空的。那么可以采取什么措施来解决这个问题呢?答案比我最初想象的要复杂一些。首先,您需要自己的 FileUploadFilter ,它可能如下所示:
public class FileUploadFilter implements Filter
{
private final static Logger LOGGER = LoggerFactory.getLogger(FileUploadFilter.class);
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
boolean isMultipart = (httpServletRequest.getContentType() == null) ? false : httpServletRequest.getContentType().toLowerCase().startsWith("multipart/");
if (isMultipart)
{
MultipartRequest multipartRequest = new MultipartRequest(httpServletRequest);
LOGGER.info("File upload request parsed succesfully, continuing with filter chain with a wrapped multipart request");
filterChain.doFilter(multipartRequest, response);
}
else
{
filterChain.doFilter(request, response);
}
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy()
{
LOGGER.info("Destroying UploadFilter");
}
下一步:在 web.xml 中注册此过滤器并删除/替换 Primefaces 过滤器。这应该看起来像这样:
<filter>
<filter-name>FileUpload Filter</filter-name>
<filter-class><YourPackage>.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
不幸的是,事实并非如此。您将需要自己的 MultipartRequest,因为您必须自己组装 FileItems 列表。但是停下来。我们必须使用与 FileItem 不兼容的 javax.servlet.Part 类。所以我写了一个新的类来连接这两个类。你可以在这里找到这个类:http://pastebin.com/JcfAYjey http://pastebin.com/JcfAYjey
最后一个难题是前面提到的 MultipartRequest,它链接 PartItem 和 FileUploadFilter。我从 Primefaces-Repository 中获取了这个类,并根据我们的需要对其进行了更改(请参阅http://pastebin.com/Vc5h2rmJ http://pastebin.com/Vc5h2rmJ)。区别在于第 47 行和第 57 行。
那么你需要做什么:
1.创建三个类FileUploadFilter、MultipartRequest和PartItem
2. 在 web.xml 中注册 FileUploadFilter
3.享受吧!
请注意:这并不是解决所有问题的解决方案,而只是您在进一步实施中可能采取的方向。例如,MultipartRequest 仅适用于具有内容类型的部分image/*
。您可能需要更改此设置。
请随意更改代码;)希望有帮助!
编辑:我忘了提及一个重要的步骤。您还需要自己的文件上传渲染器。 Primefaces 实现的一个使用了instanceof
检查以找到 MultipartRequest。由于您现在使用的是不同的导入,因此必须更改导入。班级的其他人可以保持不变(http://pastebin.com/rDUkPqf6 http://pastebin.com/rDUkPqf6)。不要忘记在 faces-config.xml 中注册它:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.FileUploadRenderer</renderer-type>
<renderer-class><YourPackage>.FileUploadRenderer</renderer-class>
</renderer>
</render-kit>