如何在我的 Vaadin 服务中接收文件内容?

Abs*_*ive 2 java vaadin vaadin12

我想向我的网络应用程序添加一个上传按钮。在 HTML 模板中,我添加了:

<link rel="import" href="../../../bower_components/vaadin-upload/src/vaadin-upload.html">

<h2 id="header-Upload">Upload</h2>
<vaadin-upload nodrop/>
Run Code Online (Sandbox Code Playgroud)

我现在想在我的后端 Vaadin 进程中接收流。然后可以将该流插入数据库中。

https://vaadin.com/components/vaadin-upload/html-examples/upload-basic-demos上的文档未提供此信息。

我相信我应该以某种方式将 a 链接StreamReceiver<vaadin-upload>有问题的问题,但我不知道该怎么做。

我正在使用 Vaadin Flow(版本 12)。

附加信息

我尝试了以下方法:

在 HTML 中:

<vaadin-upload id="upload" nodrop/>
Run Code Online (Sandbox Code Playgroud)

在爪哇中:

public class MyView extends PolymerTemplate<Model> {
    private final MemoryBuffer buffer = new MemoryBuffer();
    @Id("upload")
    private final Upload       upload = new Upload(buffer);

    public MyView() {
        upload.addSucceededListener(event -> {
            System.out.println(event.getFileName());
            System.out.println(buffer.getInputStream());
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

当我上传文件时,出现以下异常:

[qtp162821120-20] ERROR com.vaadin.flow.server.DefaultErrorHandler - 
com.vaadin.flow.server.UploadException: Upload failed
    at com.vaadin.flow.server.communication.StreamReceiverHandler.streamToReceiver(StreamReceiverHandler.java:429)

Caused by: java.lang.IllegalStateException: Upload cannot be performed without a receiver set
    at com.vaadin.flow.component.upload.Upload$DefaultStreamVariable.getOutputStream(Upload.java:581)
    at com.vaadin.flow.server.communication.StreamReceiverHandler.streamToReceiver(StreamReceiverHandler.java:358)
Run Code Online (Sandbox Code Playgroud)

Kas*_*rer 5

大量编辑:您问题的实际解决方案是您Upload在 java 类中实例化了 ,此时您应该让 Vaadin 执行此操作(因为聚合物模板)并使用 html 模板 ( <vaadin-upload id="upload" nodrop/>)中的标识符来引用此上传组件以及java代码中的( @Id("upload") private Upload upload;)。您现在可以使用在 java 类中设置上传的接收者upload.setReceiver(buffer);

public class MyView implements PolymerTemplate<Model> {

    @Id("upload") // com.vaadin.flow.component.polymertemplate
    private Upload upload; // NO INSTANTIATION!
    private private final MemoryBuffer buffer = new MemoryBuffer();

    public MyView (){
        upload.setReceiver(buffer);
        upload.addSucceededListener(event -> {
            System.out.println(event.getFileName());
            System.out.println(buffer.getInputStream());
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我最初的答案是使用一种不必要的替代方法,该方法与您的问题无关(我一开始是这么认为的),但有助于找到真正的解决方案。