为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2022-05-21 14:09:55
我想在我的 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)
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

大量编辑:您的问题的实际解决方案是您Upload在 java 类中实例化<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());

        });

    }

}

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


查看完整回答
反对 回复 2022-05-21
?
慕容3067478

TA贡献1773条经验 获得超3个赞

最好的解决方案取决于您的上下文,主要是您的后端如何接受数据?它是否接受可以读取数据的输入流,是否为您提供写入数据的输出流,或者是否有一个简单的 byte[] 来缓冲内容。

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

我最近写了一篇文章,解释了 Vaadin Upload组件的功能。检查以获取更多详细信息。


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信