我想通过实现 AbstractResource 来使用 Wicket 下载 CSV 文件。它看起来像这样:
public class ExportCsvFileResource extends AbstractResource
{
@Override
protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes)
{
AbstractResource.ResourceResponse resourceResponse = new AbstractResource.ResourceResponse();
resourceResponse.setContentType("text/csv");
resourceResponse.setFileName("exported-contacts-file.csv");
resourceResponse.setTextEncoding("utf-8");
resourceResponse.setWriteCallback(new AbstractResource.WriteCallback()
{
@Override
public void writeData(IResource.Attributes attributes) throws IOException
{
OutputStream stream = attributes.getResponse().getOutputStream();
generateContentInBatches(stream);
}
});
return resourceResponse;
}
private void generateContentInBatches(OutputStream stream)
{
int numberOfChunks=//...
for (int i=0; i<numberOfChunks; i++)
{
byte[] contentChunk = retrieveContentFromBackend(i);
IOUtils.write(contentChunk, stream);
}
}
}
问题是,当使用retrieveContentFromBackend函数生成内容时(这非常耗时),用户界面没有响应。我单击按钮等,但没有任何反应,只有在文件生成完成后,我才能再次使用该界面。
当文件逐渐生成时,如何避免阻塞用户界面?