Vaadin 上传在本地主机上有效,但在服务器上失败
Vaadin upload works on localhost, but fails on server
目标是使用 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 运行s 实例具有 2 个 CPU 和 4GB 内存。
- Glassfish:使用了几个 3.x 版本。
- 上传组件:使用了upload component and the addon easy uploads.
提供的vaadin
未检查的事项:
- OS:我的开发系统是 运行ning Windows 8.1,而服务器是基于 linux。
- Glassfish 4.x:因为我的 jenkins 部署插件还没有准备好用于 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 ...
}
}
在本地主机实例上使用它一切正常。但是将其部署到服务器会使它 return 在点击上传按钮后立即出现以下错误。但是没有显示 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.
的结果相同
如果对整体架构中使用这些技术有帮助:
- 行家 3.2.1
- Jenkins 1.602(目前只用于构建,不用于部署)
- Hibernate(不相关,因为错误发生在使用hibernate之前)
- MySQL(不相关,因为错误发生在访问数据库之前)
- JDK: 1.7
- IntelliJ 创意 14
- 玻璃鱼 3.1.2
使用的服务器主机是 Amazon AWS 和 DigitalOcean。
现在我不知道什么可以解决这个错误。有什么建议吗?我可以提供更多详细信息吗?
-- JVM 版本更新--
关于 JVM,我注意到最近在本地机器上安装了 1.8。使用 1.7 JVM 不会重现错误。
-- JVM 补丁级别的更新--
在开发环境中使用相同的补丁级别 (1.7.0_75) 不会重现错误。
升级到 Glassfish 4.1 解决了该问题。 上传和数据库进程现在运行顺利。但是我无法确定此问题背后的原因。
更多信息:
- GlassFish Server 开源版 4.1(内部版本 13)
- 有人指出我有一个 Vaadin-ticket 有同样的问题,但反过来:使用 GF 4.1 但不能使用 3.1。
- 我无法搜索与此问题有关的另一张 glassfish 票。如果有人知道,请告诉我在哪里可以添加更多信息。
目标是使用 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 运行s 实例具有 2 个 CPU 和 4GB 内存。
- Glassfish:使用了几个 3.x 版本。
- 上传组件:使用了upload component and the addon easy uploads. 提供的vaadin
未检查的事项:
- OS:我的开发系统是 运行ning Windows 8.1,而服务器是基于 linux。
- Glassfish 4.x:因为我的 jenkins 部署插件还没有准备好用于 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 ...
}
}
在本地主机实例上使用它一切正常。但是将其部署到服务器会使它 return 在点击上传按钮后立即出现以下错误。但是没有显示 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.
的结果相同如果对整体架构中使用这些技术有帮助:
- 行家 3.2.1
- Jenkins 1.602(目前只用于构建,不用于部署)
- Hibernate(不相关,因为错误发生在使用hibernate之前)
- MySQL(不相关,因为错误发生在访问数据库之前)
- JDK: 1.7
- IntelliJ 创意 14
- 玻璃鱼 3.1.2
使用的服务器主机是 Amazon AWS 和 DigitalOcean。
现在我不知道什么可以解决这个错误。有什么建议吗?我可以提供更多详细信息吗?
-- JVM 版本更新--
关于 JVM,我注意到最近在本地机器上安装了 1.8。使用 1.7 JVM 不会重现错误。
-- JVM 补丁级别的更新--
在开发环境中使用相同的补丁级别 (1.7.0_75) 不会重现错误。
升级到 Glassfish 4.1 解决了该问题。 上传和数据库进程现在运行顺利。但是我无法确定此问题背后的原因。
更多信息:
- GlassFish Server 开源版 4.1(内部版本 13)
- 有人指出我有一个 Vaadin-ticket 有同样的问题,但反过来:使用 GF 4.1 但不能使用 3.1。
- 我无法搜索与此问题有关的另一张 glassfish 票。如果有人知道,请告诉我在哪里可以添加更多信息。