vaadin FileDownloader сбросить расширение - PullRequest
0 голосов
/ 05 февраля 2019

Как мы знаем, нам нужно расширить FileDownloader кнопкой, чтобы иметь возможность загрузить файл.

//
Button downloadButton = new Button("download");

private void  updateFileForDownload(){
    ...       
    StreamResource sr = getFileStream();
    FileDownloader fileDownloader = new FileDownloader(sr);
    fileDownloader.extend(downloadButton);
    ...
}
private StreamResource getFileStream() {
    StreamResource.StreamSource source = () -> new ByteArrayInputStream(binderDocument.getBean().getFile());
    StreamResource resource = new StreamResource(source, binderDocument.getBean().getFilename());
    return resource;
}

У меня возникла проблема в приложении.Если я вызываю метод updateFileForDownload более одного раза, то получаю более одного файла, нажимая downloadButton.Мне нужно сбросить расширение для кнопки или для FileDownloader.Я пробовал оба:

 downloadButton.removeExtension(fileDownloader);

Здесь мы получаем

java.lang.IllegalArgumentException: Этот соединитель не является родительским для данного расширения в com.vaadin.server.AbstractClientConnector.removeExtension(AbstractClientConnector.java:595)

fileDownloader.removeExtension(downloadButton); 

и здесь мы не можем применить кнопку к расширению

Как я могу сбросить FileDownloader для кнопки?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы расширяете загрузку

    fileDownloader.extend(download);

, но пытаетесь удалить расширение из fileDownloader

 downloadButton.removeExtension(fileDownloader);

Это несоответствие.(Предполагая, что это опечатка.)

Вы можете удалить кнопку, а затем создать новую кнопку, новый загрузчик и затем расширить его.Однако некоторые расширения удалить нельзя.

Однако вам это не нужно.Вы можете просто обновить StreamResource и вообще не трогать привязку.

Более сложный пример - OnDemandDownloader из https://vaadin.com/docs/v8/framework/articles/LettingTheUserDownloadAFile.html

     /**
     * This specializes {@link FileDownloader} in a way, such that both the file name and content can be determined
     * on-demand, i.e. when the user has clicked the component.
     */
    public class OnDemandFileDownloader extends FileDownloader {

      /**
       * Provide both the {@link StreamSource} and the filename in an on-demand way.
       */
      public interface OnDemandStreamResource extends StreamSource {
        String getFilename ();
      }

      private static final long serialVersionUID = 1L;
      private final OnDemandStreamResource onDemandStreamResource;

      public OnDemandFileDownloader (OnDemandStreamResource onDemandStreamResource) {
        super(new StreamResource(onDemandStreamResource, ""));
        this.onDemandStreamResource = checkNotNull(onDemandStreamResource,
          "The given on-demand stream resource may never be null!");
      }

      @Override
      public boolean handleConnectorRequest (VaadinRequest request, VaadinResponse response, String path)
          throws IOException {
        getResource().setFilename(onDemandStreamResource.getFilename());
        return super.handleConnectorRequest(request, response, path);
      }

      private StreamResource getResource () {
        return (StreamResource) this.getResource("dl");
      }
    }
...