【问题标题】:Vaadin upload works on localhost, but fails on serverVaadin 上传在本地主机上工作,但在服务器上失败
【发布时间】: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


【解决方案1】:

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

更多信息:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多