Vaadin上传适用于localhost,但在服务器上失败

时间:2015-03-18 19:59:59

标签: upload glassfish vaadin ioexception multipart

目标是使用Vaadin upload-component上传文件。在localhost上它工作正常,而在服务器上我收到以下错误信息。

我在Glassfish 3.1.2(build 23)上运行应用程序并使用Vaadin 7.4.1。还尝试过除Glassfish 4之外的其他Glassfish版本,因为我还没有为Glassfish 4做好准备。

尝试或检查过的事情:

  • 大小限制:未定义,使用的文件范围为10kb到500kb。
  • JVM版本:既不使用完全相同的版本(1.7.0_52),也不使用不同的补丁级别或java版本(1.8)改变了这种情况。
  • 可能的端口限制:使用更受限制且完全打开的安全组。
  • 提供商:尝试亚马逊AWS和DigitalOcean。
  • 新系统:使用最少的安装设置一个新系统来运行应用程序。
  • 硬件资源:虽然亚马逊AWS(微型)非常有限,但DigitalOcean的实例运行时有2个CPU和4GB内存。
  • Glassfish:使用了几个3.x版本。
  • 上传组件:使用提供的vaadin upload component和插件easy uploads

未检查的事项:

  • 操作系统:我的开发系统运行的是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 ...
    }
  }

在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 [addon] [3]应该使这个过程更容易,但是localhost / server的结果相同。

如果有助于在整体架构中使用这些技术:

  • Maven 3.2.1
  • Jenkins 1.602(目前仅用于构建,不用于部署)
  • Hibernate(不相关,因为在使用hibernate之前发生了错误)
  • MySQL(不相关,因为在访问数据库之前发生错误)
  • JDK:1.7
  • IntelliJ Idea 14
  • Glassfish 3.1.2

使用过的服务器主机是Amazon AWS和DigitalOcean。

现在我不再知道什么可以解决这个错误。有什么建议?我可以提供进一步的细节吗?

- JVM版本的更新 -

关于JVM,我注意到本地我最近在本地机器上安装了1.8。使用1.7 JVM不会重现错误。

- JVM补丁级别的更新 -

在开发环境中使用相同的补丁级别(1.7.0_75)不会重现错误。

1 个答案:

答案 0 :(得分:0)

升级到Glassfish 4.1解决了这个问题。上传和数据库流程现在可以顺利运行。但是我无法确定这个问题背后的原因。

更多信息:

  • GlassFish Server开源版4.1(版本13)
  • 我被指向一个Vaadin - ticket有同样的问题,但反过来说:使用GF 4.1而不是3.1。
  • 我无法搜索与此问题有关的另一张玻璃鱼票。如果有人知道,请告诉我在哪里可以添加更多信息。