在用户上传文件的表单中,我读取文件,处理它并发回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>
答案 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);
}