【发布时间】:2015-03-18 19:59:58
【问题描述】:
目标是使用 Vaadin upload-component 上传文件。在本地主机上它工作正常,而在服务器上我收到以下错误消息。
我在 Glassfish 3.1.2(内部版本 23)上运行应用程序并使用 Vaadin 7.4.1。还尝试了除 Glassfish 4 之外的其他 Glassfish 版本,因为我有一个尚未为 Glassfish 4 准备好的依赖项。
尝试或检查的事情:
- 大小限制:未定义,使用的文件范围从 10kb 到 500kb。
- JVM 版本:既没有使用完全相同的版本 (1.7.0_52),也没有使用不同的补丁级别或 java 版本 (1.8) 改变了这种情况。
- 可能的端口限制:使用了更多限制和完全开放的安全组。
- 提供商:尝试过 Amazon AWS 和 DigitalOcean。
- 全新系统:设置全新系统,只需最少的安装即可运行应用程序。
- 硬件资源:虽然 Amazon AWS(微)非常有限,但 DigitalOcean 实例使用 2 个 CPU 和 4GB 内存运行。
- Glassfish:使用了几个 3.x 版本。
- 上传组件:使用了upload component提供的vaadin和easy uploads的插件。
未检查的内容:
- 操作系统:我的开发系统运行的是 Windows 8.1,而服务器是基于 linux 的。
- Glassfish 4.x:由于我的 jenkins deploy 插件还没有为 Glassfish 4.x 做好准备,所以我还没有尝试过。
- Vaadin:尚未降级 Vaadin。
上传组件的代码看起来像这样,可能已经修改了几次试图修复错误。
上传组件:
ImageUploader receiver = new ImageUploader();
upload = new Upload("", receiver);
upload.addSucceededListener(receiver);
addComponent(upload);
ImageUploader(取自Book of Vaadin):
class ImageUploader implements Upload.Receiver, Upload.SucceededListener {
public OutputStream receiveUpload(String filename, String mimeType) {
// Create upload stream
FileOutputStream fos = null; // Stream to write to
File file = new File(filename);
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
... database stuff ...
// Return the output stream to write to, necessary for framework
return fos;
}
public void uploadSucceeded(Upload.SucceededEvent event) {
... UI-Stuff ...
}
}
在 localhost 实例上使用它一切正常。但是将其部署到服务器会使其在点击上传按钮后立即返回以下错误。但是没有显示 UI 错误消息。
[#|2015-03-17T15:42:14.153+0000|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=515;_ThreadName=Thread-2;|StandardWrapper$
java.io.IOException: The multipart stream ended unexpectedly
at com.vaadin.server.communication.FileUploadHandler.readLine(FileUploadHandler.java:302)
at com.vaadin.server.communication.FileUploadHandler.doHandleSimpleMultipartFileUpload(FileUploadHandler.java:360)
at com.vaadin.server.communication.FileUploadHandler.handleRequest(FileUploadHandler.java:285)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:745)
|#]
还有一个 Vaadin [插件][3] 应该使过程更容易,但对于 localhost/server 的结果相同。
如果在整体架构中使用这些技术有帮助:
- Maven 3.2.1
- Jenkins 1.602(目前仅用于构建,不用于部署)
- 休眠(不相关,因为错误发生在使用休眠之前)
- MySQL(不相关,因为错误发生在访问数据库之前)
- JDK:1.7
- IntelliJ 理念 14
- Glassfish 3.1.2
使用的服务器主机是 Amazon AWS 和 DigitalOcean。
现在我不知道什么可以解决这个错误。有什么建议吗?我可以提供更多详细信息吗?
-- 更新JVM版本--
关于 JVM,我注意到我最近在本地机器上安装了 1.8。使用 1.7 JVM 不会重现错误。
-- JVM 补丁级别更新--
在开发环境中使用相同的补丁级别(1.7.0_75)不会重现错误。
【问题讨论】:
-
对上传大小有任何限制吗?您的生产环境是否合理地接近您的开发环境?
-
我没有设置任何大小限制,文件大小不超过 500kb。生产在linux服务器上运行,而本地机器是windows。服务器上的硬件资源比本地机器上的要小,但应该不是异常的原因。将在描述中更新。
标签: upload glassfish vaadin ioexception multipart