wicket提供下载文件

wicket提供下载文件,wicket,Wicket,我有一个带有提交按钮的面板。在Submit上,我想将一些文本写入一个文件,并提供该文件供用户下载。我不知道该怎么做。如果有人能指向一个真正有帮助的链接或代码,这并不容易。我使用了下载链接,但下载链接没有使用任何表单变量,因为单击下载链接不会提交表单。它只使用初始值。我必须使用ajaxonchange事件来更新表示表单组件的实例变量,然后使用下载链接根据用户输入创建一个文件 如中所述,您需要创建一种行为来构造文件,然后从提交链接触发该行为。这将确保在创建文件时使用模型更新之前,模型更新已完成 从资

我有一个带有提交按钮的面板。在Submit上,我想将一些文本写入一个文件,并提供该文件供用户下载。我不知道该怎么做。如果有人能指向一个真正有帮助的链接或代码,这并不容易。我使用了下载链接,但下载链接没有使用任何表单变量,因为单击下载链接不会提交表单。它只使用初始值。我必须使用ajaxonchange事件来更新表示表单组件的实例变量,然后使用下载链接根据用户输入创建一个文件

如中所述,您需要创建一种行为来构造文件,然后从提交链接触发该行为。这将确保在创建文件时使用模型更新之前,模型更新已完成

从资源流创建请求的行为实现:

public abstract class AJAXDownload extends AbstractAjaxBehavior
{
    private boolean addAntiCache;

    public AJAXDownload() {
        this(true);
    }

    public AJAXDownload(boolean addAntiCache) {
        super();
        this.addAntiCache = addAntiCache;
    }

    /**
     * Call this method to initiate the download.
     */
    public void initiate(AjaxRequestTarget target)
    {
        String url = getCallbackUrl().toString();

        if (addAntiCache) {
            url = url + (url.contains("?") ? "&" : "?");
            url = url + "antiCache=" + System.currentTimeMillis();
        }

        // the timeout is needed to let Wicket release the channel
        target.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);");
    }

    public void onRequest()
    {
        ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(getResourceStream(),getFileName());
        handler.setContentDisposition(ContentDisposition.ATTACHMENT);
        getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
    }

    /**
     * Override this method for a file name which will let the browser prompt with a save/open dialog.
     * @see ResourceStreamRequestTarget#getFileName()
     */
    protected String getFileName()
    {
        return null;
    }

    /**
     * Hook method providing the actual resource stream.
     */
    protected abstract IResourceStream getResourceStream();
}
(提交)链接和行为实现:

final AJAXDownload download = new AJAXDownload()
{
    @Override
    protected IResourceStream getResourceStream()
    {
        return createResourceStream(item.getModelObject());
    }
};
item.add(download);

item.add(new AjaxSubmitLink("link") {
    @Override
    public void onSubmit(AjaxRequestTarget target, Form<?> form)
    {
        // do whatever with the target, e.g. refresh components
        target.add(...);

        // finally initiate the download
        download.initiate(target);
    }
});
final AJAXDownload=新的AJAXDownload()
{
@凌驾
受保护的IResourceStream getResourceStream()
{
返回createResourceStream(item.getModelObject());
}
};
添加(下载);
添加(新的AjaxSubmitLink(“链接”){
@凌驾
提交时公共无效(AjaxRequestTarget目标,表单)
{
//对目标执行任何操作,例如刷新组件
目标。添加(…);
//最后开始下载
下载。启动(目标);
}
});

@magomi针对这个问题创建了一个类似的实现。

看看这篇文章,感谢您发布答案!请注意,您应该将答案的重要部分发布在此网站上,否则您的帖子可能会被删除。如果您愿意,您可以继续添加该链接,但仅作为“参考”。答案应该是独立的,不需要链接。