Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在我的Vaadin服务中接收文件内容?_Java_Vaadin_Vaadin12 - Fatal编程技术网

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

Java 如何在我的Vaadin服务中接收文件内容?,java,vaadin,vaadin12,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/> 在Java中: public class MyView extends Po

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

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

<h2 id="header-Upload">Upload</h2>
<vaadin-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());
        });
    }
}

massive Edit:问题的实际解决方案是在java类中实例化了
上传
,这时您应该让Vaadin这样做(因为聚合模板),并使用html模板(
)和java代码(
@Id)中的标识符引用此上传组件(“upload”)private upload upload;
)。您现在可以使用
upload.setReceiver(buffer);
在java类中设置上载的接收器

公共类MyView实现PolymerTemplate{
@Id(“上传”)//com.vaadin.flow.component.polymertemplate
私有上传;//没有实例化!
private private final MemoryBuffer buffer=new MemoryBuffer();
公共MyView(){
upload.setReceiver(缓冲区);
upload.addSucceededListener(事件->{
System.out.println(event.getFileName());
System.out.println(buffer.getInputStream());
});
}
}

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

最佳解决方案取决于您的上下文,主要取决于您的后端如何接受数据?它是否接受可以读取数据的inputstream,是否为您提供写入数据的outputstream,或者是否有一个简单的字节[]用于缓冲内容

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


我最近编写了一个组件。请查看更多详细信息。

您是在java中创建上载实例,还是只在html中创建上载实例?如果您在java中使用它,您可以尝试给它一个id,例如
,并在相应的java文件中将其与
@id(“上载”)绑定private Upload Upload
并从那里完成其余的工作。@Cashbee我试图用HTML定义按钮,并用Java完成所有回调/流处理。在问题中查看我的更新。@Tazavoo我试过了,但我遇到了一个无法解释的异常。有什么想法吗?谢谢。
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)
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());
        });
    }
}