Tapestry:在onSuccess()中将我的StreamResponse搞砸后重定向

时间:2011-09-02 19:03:15

标签: tapestry

在用户上传文件的表单中,我读取文件,处理它并发回CSV(StreamResponse)。我正面临流回结果的问题。在Firebug中,我看到帖子响应为'302 Moved Temporarily',我的页面再次重新加载而不显示流式传输的文件。我认为tapestry的重定向后发布正在重新加载页面,而不是回送我发送的文件。这是发生了什么?我该如何克服这个问题?非常感谢任何帮助!

这是我的代码:

(将其剪切到主要部分)

@Log 
StreamResponse onSuccess() throws IOException {
    File tmpFile = File.createTempFile(urlFile.getFileName(), null); 
    BufferedWriter br = new BufferedWriter(new FileWriter(tmpFile)); 
    br.append("something to test\nAnother line to test"); 
    br.flush(); 
    br.close(); 
    return new CsvStreamResponse(new FileInputStream(tmpFile.getAbsolutePath()), "results_file"); 
} 

public class CsvStreamResponse implements StreamResponse { 
    private InputStream is; 
    private String filename; 

    public CsvStreamResponse(InputStream is, String filename) { 
        this.is = is; 
        this.filename = filename; 
    } 

    public String getContentType() { 
        return "text/csv"; 
    } 

    public InputStream getStream() throws IOException { 
        return is; 
    } 

    public void prepareResponse(Response response) { 
        response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv"); 
    } 
} 

我的TML

<form t:type="form" t:id="analysis">
    <t:upload t:id="urlFile" class="marginRight" validate="required"/>
    <t:submit class="marginRight white button medium" value="${message:button.upload}" t:id="upload"/>
</form>

2 个答案:

答案 0 :(得分:1)

在从表单处理程序返回StreamResponse之前,我从未遇到过这种情况。一个非常有效的情况,如果你问我这样应该是可能的。检查API,您会注意到Response有setStatus(int sc)方法。我没有对它进行测试,但是如果你将prepareResponse()方法更改为以下方法,它应该可以工作:

public void prepareResponse(Response response) { 
    response.setStatus(HttpServletResponse.SC_OK);
    response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv"); 
}
免责声明:我自己没试过。

答案 1 :(得分:1)

Tapestry将在发布后重定向,因此在帖子上返回StreamResponse不是一个好主意。返回发起事件的Link。当tapestry重定向到事件URL时,您可以返回StremResponse

@Inject
private ComponentResources resources;

Link onSuccess() {
    String fileName = urlFile.getFileName();
    return resources.createEventLink("doCsv", fileName);
}

StreamResponse onDoCsv(String fileName) {
    return new CsvStreamResponse(fileName);
}