Quiero añadir un botón de subida a mi aplicación web. En la plantilla HTML, añadí:
<link rel="import" href="../../../bower_components/vaadin-upload/src/vaadin-upload.html">
<h2 id="header-Upload">Upload</h2>
<vaadin-upload nodrop/>
ahora quiero recibir la corriente en mi proceso de back-end Vaadin. Esta corriente puede ser luego insertado en la base de datos.
La documentación sobre https://vaadin.com/components/vaadin-upload/html-examples/upload-basic-demos no proporciona esta información.
Creo que de alguna manera debería vincular una StreamReceiver
a la <vaadin-upload>
que se trate, pero no estoy seguro de cómo hacer eso.
Estoy usando Vaadin Flow (versión 12).
Información Adicional
He intentado lo siguiente:
En HTML:
<vaadin-upload id="upload" nodrop/>
En 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());
});
}
}
Al cargar un archivo, me sale el siguiente excepción:
[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)
masiva Editar : La solución real a su problema era que las instancias de los Upload
de tu clase de Java, en las que debe Vaadin hacer esto (a causa de la plantilla de polímero) y se refieren a este componente de carga usando un identificador tanto en la plantilla html ( <vaadin-upload id="upload" nodrop/>
) como así como en el código java ( @Id("upload") private Upload upload;
). Ahora puede configurar el receptor de la carga en la clase Java utilizando 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());
});
}
}
Mi respuesta inicial fue el uso de un enfoque alternativo innecesaria que no estaba relacionado con su problema (me lo imaginaba en un principio), pero ayudó a encontrar la solución real.