在 Struts 2 中上传大文件时出现 SocketTimeOut

问题描述 投票:0回答:1

我想将图片发布到我的服务器(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?

java spring file-upload struts2 java-io
1个回答
0
投票

Spring 使用的默认范围是

singleton
。所以你的代码失败是因为文件上的同步IO操作。

当您将其更改为

prototype
时,每个操作都有自己的操作 bean 实例,因此它们使用自己的字段并且不会相互粘连。

© www.soinside.com 2019 - 2024. All rights reserved.