如何在没有按钮的情况下在vaadin中启动文件下载?

时间:2013-12-05 12:25:27

标签: vaadin vaadin7

我知道创建FileDownloader并使用Button调用扩展非常容易。但是如何在没有Button的情况下开始下载?
在我的具体情况下,我现在有ComboBox,根据输入更改其值后,生成我要发送给用户的文件。应立即发送该文件,而无需等待再次单击。这很容易吗?

由于 拉斐尔

3 个答案:

答案 0 :(得分:15)

我自己找到了解决方案。其实两个。 第一个使用已弃用的方法Page.open()

public class DownloadComponent extends CustomComponent implements ValueChangeListener {
private ComboBox cb = new ComboBox();

public DownloadComponent() {
    cb.addValueChangeListener(this);
    cb.setNewItemsAllowed(true);
    cb.setImmediate(true);
    cb.setNullSelectionAllowed(false);
    setCompositionRoot(cb);
}

@Override
public void valueChange(ValueChangeEvent event) {
    String val = (String) event.getProperty().getValue();
    FileResource res = new FileResource(new File(val));
    Page.getCurrent().open(res, null, false);
}
}

javadoc here提到了一些内存和安全问题,并将其标记为已弃用


在第二步中,我尝试通过在DownloadComponent中注册资源来绕过这个弃用的方法。如果vaadin专家评论这个解决方案,我会很高兴。

public class DownloadComponent extends CustomComponent implements ValueChangeListener {
private ComboBox cb = new ComboBox();
private static final String MYKEY = "download";

public DownloadComponent() {
    cb.addValueChangeListener(this);
    cb.setNewItemsAllowed(true);
    cb.setImmediate(true);
    cb.setNullSelectionAllowed(false);
    setCompositionRoot(cb);
}

@Override
public void valueChange(ValueChangeEvent event) {
    String val = (String) event.getProperty().getValue();
    FileResource res = new FileResource(new File(val));
    setResource(MYKEY, res);
    ResourceReference rr = ResourceReference.create(res, this, MYKEY);
    Page.getCurrent().open(rr.getURL(), null);
}
}

注意:我真的不允许用户在服务器上打开我的所有文件,你应该那样做。这只是为了演示。

答案 1 :(得分:7)

这是我的解决方法。它对我来说就像一个魅力。希望它会对你有所帮助。

  1. 创建一个按钮并通过Css隐藏它(不是代码:button.setInvisible(false))

    final Button downloadInvisibleButton = new Button();
    downloadInvisibleButton.setId("DownloadButtonId");
    downloadInvisibleButton.addStyleName("InvisibleButton");
    

    在您的主题中,添加此规则以隐藏downloadInvisibleButton

    .InvisibleButton {
        display: none;
    }
    
  2. 当用户点击menuItem时:将fileDownloader扩展为downloadInvisibleButton,然后通过JavaScript模拟downloadInvisibleButton上的点击。

    menuBar.addItem("Download", new MenuBar.Command() {
      @Override
      public void menuSelected(MenuBar.MenuItem selectedItem) {
        FileDownloader fileDownloader = new FileDownloader(...);
        fileDownloader.extend(downloadInvisibleButton);
        //Simulate the click on downloadInvisibleButton by JavaScript
        Page.getCurrent().getJavaScript()
           .execute("document.getElementById('DownloadButtonId').click();");
      }
    });
    

答案 2 :(得分:0)

由于我不允许发表评论,我将其添加为答案。 隐藏按钮的问题是,这在iOS设备上不起作用。我宁愿使用MenuBar和MenuItem,但Vaadin尚不支持 - 请参阅Github issue #4057。使用MenuBar和MenuItem时建议的解决方法将导致使用隐藏按钮......