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

我想在我的 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上的文档未提供此信息。


我相信我应该以某种方式将 a 链接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)


偶然的你
浏览 103回答 2
2回答

白衣非少年

大量编辑:您的问题的实际解决方案是您Upload在 java 类中实例化<vaadin-upload id="upload" nodrop/>了以及在 java 代码 ( @Id("upload") private Upload upload;) 中。您现在可以在 java 类中使用upload.setReceiver(buffer);.public class MyView implements PolymerTemplate<Model> {&nbsp; &nbsp; @Id("upload") // com.vaadin.flow.component.polymertemplate&nbsp; &nbsp; private Upload upload; // NO INSTANTIATION!&nbsp; &nbsp; private private final MemoryBuffer buffer = new MemoryBuffer();&nbsp; &nbsp; public MyView (){&nbsp; &nbsp; &nbsp; &nbsp; upload.setReceiver(buffer);&nbsp; &nbsp; &nbsp; &nbsp; upload.addSucceededListener(event -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(event.getFileName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(buffer.getInputStream());&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }}我最初的回答是使用与您的问题无关的不必要的替代方法(我起初是这么认为的),但有助于找到真正的解决方案。

慕容3067478

最好的解决方案取决于您的上下文,主要是您的后端如何接受数据?它是否接受可以读取数据的输入流,是否为您提供写入数据的输出流,或者是否有一个简单的 byte[] 来缓冲内容。如果您在表单中使用 Binder,则可以使用 Viritin 插件中的 ByteArrayUploadField,它直接绑定到您可能在域对象中拥有的 byte[] 类型。我最近写了一篇文章,解释了 Vaadin Upload组件的功能。检查以获取更多详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java