2

vaadin 7では、使用時にファイル名をどのように遅延して決定しますFileDownloaderか?

final Button downloadButton = new Button("Download file");
FileDownloader downloader = new FileDownloader(new StreamResource(new StreamSource() {
    @Override
    public InputStream getStream () {
        return new ByteArrayInputStream(expesiveCalculationOfContent());
    }
}, "file.snub"));

downloader.extend(downloadButton);

このコード サンプルでは、​​明らかにファイル名

  1. ゴミです
  2. 早い段階で知る必要があります。

ダウンロードしたファイルのファイル名を遅延して決定するにはどうすればよいですか?

4

3 に答える 3

9

汚れているかどうかはわかりませんが、これは機能します。FileDownloader.handleConnectorRequest() を拡張して、そのスーパーのメソッドを呼び出す前に StreamResource.setFilename() を呼び出します。

    {
        final Button downloadButton = new Button("Download file");
        final StreamResource stream = new StreamResource(
                new StreamSource() {
                    @Override
                    public InputStream getStream() {
                        return new ByteArrayInputStream("Hola".getBytes());
                    }
                }, "badname.txt");
        FileDownloader downloader = new FileDownloader(stream) {
            @Override
            public boolean handleConnectorRequest(VaadinRequest request,
                    VaadinResponse response, String path)
                    throws IOException {
                stream.setFilename("better-name.txt");
                return super
                        .handleConnectorRequest(request, response, path);
            }
        };

        downloader.extend(downloadButton);
        layout.addComponent(downloadButton);
    }
于 2013-04-04T21:40:11.833 に答える
3

これが私が思いついた最終的な解決策です:

/**
 * 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");
  }

}
于 2013-04-05T09:30:44.793 に答える