Гобелен: переадресация после публикации испортила мой StreamResponse в onSuccess () - PullRequest
0 голосов
/ 02 сентября 2011

В форме сообщения пользователь загружает файл, я читаю файл, обрабатываю его и отправляю обратно CSV (StreamResponse).Я столкнулся с проблемой потоковой передачи результатов.В Firebug я вижу пост-ответ как «302 Moved Temporary», и моя страница снова перезагружается без отображения потокового файла.Я думаю, что переадресация после публикации 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 ]

1 голос
/ 16 октября 2012

Гобелен будет перенаправлять после публикации, поэтому возвращение StreamResponse для публикации не является хорошей идеей. Вернуть Link, который запускает событие. Когда гобелен перенаправляет на 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);
}
1 голос
/ 10 сентября 2011

Я никогда не сталкивался с этим раньше, когда вы возвращаете 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"); 
}

отказ от ответственности: я сам не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...