我在过去3天里一直在阅读很多东西,试图找到解决问题的方法,Is it posible to change upload path with a servlet?,我尝试了很多方法,现在我明白了关于Java的更多信息,但我仍然无法找到解决问题的方法。
最接近我发现的工作是使用过滤器和HttpServletRequestWrapper和HttpServletResponseWrapper,但我的问题是,就像很多人在这里问过的那样,在得到一次响应后,它就消失了许多人建议使用包装纸,但包装纸在使用1次后也会消失。
我的代码试图实现一个非常简单的工作示例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(httpReq);
List<FileItem> items = upload.parseRequest(reqWrapper); //<--All cool
filterChain.doFilter(reqWrapper, response); //<--reqWrapper still
//has request but when I try to get the file
//through org.apache.commons.fileupload.FileUpload, the file is null
}
此外,如果我按照此处说明的示例进行尝试:Differences between ServletResponse and HttpServletResponseWrapper?
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(httpReq);
filterChain.doFilter(reqWrapper, response); //<--All cool
//**It goes and does an action, which gets Form parameters and file from a POST request and saves file to folder within context**
List<FileItem> items = upload.parseRequest(reqWrapper);//<--throws exception:
//org.apache.commons.fileupload.FileUploadException: Stream Closed
}
我还为我的包装器实现了类,它们工作正常,但是当我尝试在同一个实例中再次使用请求时,它已经消失了。这样做的正确方法是什么,还是不可能做到?
我只敢问这个冒着负面投票的风险,因为我花了40多个小时试图找到解决方案,但我根本无法解决这个问题。感谢您的耐心和理解。
编辑:忘记提及我这样做是为了获取输入值和来自后请求多部分数据的文件
EDIT2:更改了对代码的评论,以便更加清晰。
EDIT3:再次更改评论以显示堆栈跟踪例外
我想要实现的是使用两次表单POST数据。这是为了复制上传的文件而不必修改原始操作(servlet)。我认为HttpServletRequestWrapper会从我的表单中包装我的POST数据,以便我可以重用它,但现在我明白它没有。
有没有实现这个目标?
答案 0 :(得分:0)
现在我知道他们真正做了什么,好吧,就像他们的名字所暗示的那样,他们包装了请求和响应,这有一些用处,但不是我想做的事情。您不能两次从客户端请求数据,客户端只向您发送一次数据,因此如果再次请求再次使用请求,您将再次请求数据,但客户端将不会再次发送数据发了。并且包装器不会包装POST数据,一旦你收到它,你必须找到一种方法将它存储在某个地方然后再次使用它。
在我的情况下,我创建了表单方法静态,我可以从过滤器访问表单元素和值。例如:
public class MyActionForm extends org.apache.struts.action.ActionForm {
private static org.apache.struts.upload.FormFile file;
private static String anyname;
public static FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
public static String getAnyname() {
return anyname;
}
public void setAnyname(String anyname) {
this.anyname = anyname;
}
在过滤器内:
String name = MyActionForm.getAnyname();
FormFile imagen = MyActionForm.getFile();
现在我不需要再次处理请求,因为我无论如何都不会得到数据,而且我不需要解析数据或任何东西,我只是使用表单元素值,这就是我我想得到。
希望这有助于某人。