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

时间:2019-01-23 10:23:52

标签: java vaadin vaadin12

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

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

<h2 id="header-Upload">Upload</h2>
<vaadin-upload nodrop/>

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

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

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

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

其他信息

我尝试了以下操作:

在HTML中:

<vaadin-upload id="upload" nodrop/>

在Java中:

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());
        });
    }
}

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

[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)

2 个答案:

答案 0 :(得分:2)

大规模修改:针对您问题的实际解决方案是,您应该让Vaadin这样做(由于使用了聚合物模板),并在Java类中实例化了Upload并引用了使用HTML模板(<vaadin-upload id="upload" nodrop/>)和Java代码(@Id("upload") private Upload upload;)中的标识符将此上传组件添加到此上传组件。现在,您可以使用upload.setReceiver(buffer);在java类中设置上传的接收者。

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());
        });
    }
}

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

答案 1 :(得分:1)

最佳解决方案取决于您的上下文,主要是您的后端如何接受数据?它接受输入流可以在其中读取数据的输入流吗?是否为您提供了在其中写入数据的输出流?还是在其中缓冲内容的简单byte []。

如果您在表单中使用Binder,则可以使用Viritin附加组件中的ByteArrayUploadField,它直接绑定到域对象中可能具有的byte []类型。

我最近写了an article that explains the functionality of Vaadin Upload组件。检查以获取更多详细信息。