我想将图片发布到我的服务器(Tomcat 7.0.40)。
该项目基于 apache-struts2-2.2.1、spring 3.6 和 apache-commons-fileupload 构建。
首先,我编写一些 HTML 代码。
<input type="file" name="xxx" id="ccc" />
好的,接下来。我做出一个动作延伸
ActionSupport
。
public XxxAction extends ActionSupport{
private java.io.File xxx;
public String execute() throws Exception{
......
}
//getter and setter below
}
接下来,这个动作是由 spring 配置注入的,如:
<bean id="xxxAction" class="xxx.xxx.XxxAction" />
也许你发现我输了
scope="prototype"
,但请忽略它,因为问题不在那里。
接下来,通过
struts2.xml
进行配置,例如:
<package name="xxx" namespace="/xxx" extends="json-default">
<action name="upload" class="xxxAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/gif,image/jpg</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>
<param name="root">toFrontJson</param>
</result>
</action>
</package>
好的,现在我向服务器提交一个图片文件。我们假设该操作可以接收该文件。但是当图片大到足以通过一会儿时,在通过的一半时我关闭了网络浏览器。它将得到
SocketTimeOut
异常。我在 Tomcat 配置文件夹中找到了 server.xml
,连接超时设置为 20000。最重要的是,当我遇到此异常时。对此操作的其他请求无法访问。它将得到:
cannot find aciton or result ......
我认为
SocketTimeOut
异常一定会导致某些事情发生。它让动作实例消失。所以,我在scope="prototype"
中添加了spring.xml
。它有效。
虽然,当我中断文件上传操作时,我遇到了一些其他异常,但其他请求都可以。
但是,我希望知道在添加
scope="prototype"
之前发生了什么,为什么其他请求找不到该操作,以及为什么我得到 SocketTimeOut
异常。
在 apache-commons-fileupload 中?还是 Struts 2?
Spring 使用的默认范围是
singleton
。所以你的代码失败是因为文件上的同步IO操作。
当您将其更改为
prototype
时,每个操作都有自己的操作 bean 实例,因此它们使用自己的字段并且不会相互粘连。