我想向我的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)
答案 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组件。检查以获取更多详细信息。