如何在我的 Vaadin 服务中接收文件内容?
How can I receive the file contents in my Vaadin service?
我想在我的网络应用程序中添加一个上传按钮。在 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 上的文档未提供此信息。
我想我应该以某种方式 link 向有问题的 <vaadin-upload>
发送 StreamReceiver
,但我不确定该怎么做。
我正在使用 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)
大量编辑:您的问题的实际解决方案是您在 java class 中实例化了 Upload
,当您应该让 Vaadin 这样做(因为聚合物模板)并在 html 模板(<vaadin-upload id="upload" nodrop/>
)和 java 代码(@Id("upload") private Upload upload;
).您现在可以使用 upload.setReceiver(buffer);
.
在 java class 中设置上传接收者
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());
});
}
}
我最初的回答是使用一种不必要的替代方法,该方法与您的问题无关(一开始我是这么认为的),但有助于找到真正的解决方案。
最佳解决方案在一定程度上取决于您的上下文,主要是您的后端如何接受数据?它是否接受可以读取数据的输入流,它是否为您提供了一个输出流来写入它,或者是否有一个简单的 byte[] 来缓冲内容。
如果您在表单中使用 Binder,则可以使用 Viritin 附加组件中的 ByteArrayUploadField,它直接绑定到域对象中可能具有的 byte[] 类型。
我最近写了 an article that explains the functionality of Vaadin Upload 个组件。查看更多详细信息。
我想在我的网络应用程序中添加一个上传按钮。在 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 上的文档未提供此信息。
我想我应该以某种方式 link 向有问题的 <vaadin-upload>
发送 StreamReceiver
,但我不确定该怎么做。
我正在使用 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)
大量编辑:您的问题的实际解决方案是您在 java class 中实例化了 Upload
,当您应该让 Vaadin 这样做(因为聚合物模板)并在 html 模板(<vaadin-upload id="upload" nodrop/>
)和 java 代码(@Id("upload") private Upload upload;
).您现在可以使用 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());
});
}
}
我最初的回答是使用一种不必要的替代方法,该方法与您的问题无关(一开始我是这么认为的),但有助于找到真正的解决方案。
最佳解决方案在一定程度上取决于您的上下文,主要是您的后端如何接受数据?它是否接受可以读取数据的输入流,它是否为您提供了一个输出流来写入它,或者是否有一个简单的 byte[] 来缓冲内容。
如果您在表单中使用 Binder,则可以使用 Viritin 附加组件中的 ByteArrayUploadField,它直接绑定到域对象中可能具有的 byte[] 类型。
我最近写了 an article that explains the functionality of Vaadin Upload 个组件。查看更多详细信息。