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 的依赖项。

尝试或检查的事情:

未检查的事项:

上传组件的代码是这样的,可能已经修改了几次试图修复错误。

上传组件:

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.

的结果相同

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

使用的服务器主机是 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 票。如果有人知道,请告诉我在哪里可以添加更多信息。