2011-05-29 554 views
1

通常,我需要通过调用servlet的html表单上传大文件,然后用繁重的算法处理该文件,并返回一个xml文档作为响应。 这整个过程需要很长时间,所以为了避免浏览器超时连接,我决定创建一个对象(扩展Thread),这个对象将执行耗时的过程(上载文件并操作它)在不同的线程中这将能够表明过程的进展。为此,我需要将HttpServletRequest请求作为参数传递给对象。 当我试图解析请求参数(我使用Apache的百科全书文件上传),我得到了以下异常:将HttpServletRequest对象作为参数传递

"the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null" . 

是否有可能一个HttpServletRequest对象传递给一个对象扩展Thread?如果是这样,安全地做到这一点的正确做法是什么?

+0

您的html表单是否包含值为'multipart/form-data'的enctype属性? – asgs 2011-05-29 17:30:25

+0

是的。我可以在doPost方法中轻松完成,问题是当我将请求作为参数传递时。 – ElChe 2011-05-29 17:37:55

回答

3

你不应该。当请求对象在线程中使用时,请求可能不再有效,并且Tomcat可能已经清除了它(因此,您的例外)(当然,假设您的表单确实是enctype="multipart/form-data"

所以,为了处理这适当地从请求中提取数据并将其传递给新线程。因此,您不会依赖于请求对象 - 仅限于其内容。

请注意,Servlet 3.0为异步服务器端处理添加了一个选项,这对您来说似乎是一个不错的选择 - check it out

+0

感谢您指出异步服务器端处理,我会研究它。我想阻止浏览器等待,直到我完成从请求中提取文件(就像我现在在doPost方法中那样),所以我想在不同的线程中完成它。那么将请求作为参数传递是不可能的? – ElChe 2011-05-29 17:48:38

+0

只需从中获取数据不应该很昂贵,所以获取数据并将其传递给线程。 – Bozho 2011-05-29 18:03:23

+0

您能否再解释一下“请求可能不再有效”?当时,这个答案已经有几年了,可能没人会看到这个评论。 – Rebeccah 2016-08-02 21:39:40

0

您收到的错误表明客户端的表单可能没有正确设置。请确保您的表单是这样定义的:

<FORM action="YOUR_SERVLET" 
    enctype="multipart/form-data" 
    method="post"> 
+0

它的确如此。我在doPost方法中很容易做到这一点,问题是当我将请求作为参数传递时。 – ElChe 2011-05-29 17:50:13

相关问题