我目前正在处理一个项目,通过浏览器导入一个CSV文件,然后将该文件中包含的数据传输到数据库中。
我编写的代码适用于小文件,但事实证明该应用程序不适用于大文件(超过200MB)。
import.xhtml:
...
<t:panelGrid columns="2" styleClass="table_layout center" columnClasses="col_label,col_input">
<t:outputLabel for="importFile" styleClass="required" value="#{messages.import_file}" />
<t:inputFileUpload id="importFile" value="#{imports.csv}" required="true" />
<t:panelGroup colspan="2" styleClass="center">
<t:commandButton action="#{imports.import}" value="#{messages.import_action_import}" disabled="#{imports.state}" reRender="pnl" />
</t:panelGroup>
</t:panelGrid>
...
ImportBean.java
public String import() throws IOException {
System.out.println("Entering import()");
...
if (csv != null) {
fileInputStream = csv.getInputStream();
}
final InputStream fileInputStreamF = fileInputStream;
Runnable r = new Runnable() {
public void run() {
System.out.println("Entering run()");
try {
System.out.println("Before entering importService.import(InputStream)");
importService.import(fileInputStreamF);
} catch (MyException e) {
...
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
System.out.println("Before running Thread");
Thread thread = new Thread(r);
}
因此,当我试图上传一个小文件时,控制台显示:
Entering import()
Before running Thread
Entering run()
Before entering importService.import(InputStream)
但当我尝试上传一个大文件时,控制台完全不显示任何内容,这意味着(我相信)ImportBean.import()
没有被调用。
对于这个项目,我使用Java5、JSF1.1和Tomcat5。我的猜测是,我应该在Tomcat中配置一些东西,但我不确定
有什么想法吗?
EDIT:我试图在Tomcat server.xml中将maxPostSize
设置为0,但似乎没有任何作用。我刚刚使用了一个数据包分析器(Wireshark),看起来文件上传了大约一分钟后就停止了。当它停止时,控制台上仍然什么都没有。。。
尝试增加web.xml
中的max-file-size
和max-request-size
。重新启动tomcat,然后再次部署WAR文件。
如果最大文件大小和最大请求大小不起作用,问题可能是传输时间过长,超过了浏览器超时时间。
我使用struts处理了一个类似的问题,解决这个问题的唯一方法是让客户端在zip文件中传输csv,然后我们解压缩并处理该文件。
我们的导入功能也需要一段时间来处理文件,因此我们必须将用户转发到一个定期检查导入状态的刷新页面。