gpt4 book ai didi

tomcat - 如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?

转载 作者:行者123 更新时间:2023-11-28 21:45:24 24 4
gpt4 key购买 nike

我想在我的 JSF 应用程序中上传一个文件。我正在使用 FilterHttpServletRequestWrapper 访问上传文件。

 public MultipartRequestWrapper(HttpServletRequest request) {
super(request);
System.out.println("Created multipart wrapper....");
try {
System.out.println("Looping parts"+getParts().size());

for (Part p : getParts()) {
System.out.println(String.format("Part name: %1$s, contentType : %2$s", p.getName(), p.getContentType()));
for(String header : p.getHeaderNames()){
System.out.println("Header name : " + header + ", value : " + p.getHeader(header));
}
byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]{new String(b)});
}
} catch (IOException ex) {
ex.printStackTrace();
Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
} catch (ServletException ex) {
ex.printStackTrace();
Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
}

但是,getParts() 返回一个空集合。如何在 Tomcat 7.0.8 的 servlet 过滤器中启用 multipart/form-data 解析?

最佳答案

为了得到 HttpServletRequest#getParts() Filter 工作在Tomcat中,你需要设置allowCasualMultipartParsing="true"在 webapp 的 <Context> Webapp/META-INF/context.xml 中的元素或 Tomcat/conf/server.xml .

<Context ... allowCasualMultipartParsing="true">

因为根据 servlet 3.0 规范, HttpServletRequest#getParts() 应该只在 HttpServlet 内可用与 @MultipartConfig 注解。另请参阅 <Context> 的文档元素:

allowCasualMultipartParsing

Set to true if Tomcat should automatically parse multipart/form-data request bodies when HttpServletRequest.getPart* or HttpServletRequest.getParameter* is called, even when the target servlet isn't marked with the @MultipartConfig annotation (See Servlet Specification 3.0, Section 3.2 for details). Note that any setting other than false causes Tomcat to behave in a way that is not technically spec-compliant. The default is false.

另见:


与具体问题无关,以下肯定是不对的:

byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]{new String(b)});

首先,您没有遵守客户端指定的字符编码 - 如果有的话。其次,这对于二进制文件将失败。

关于tomcat - 如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8047173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com