-
1. Re: how to set the contenttype in reponse header under the a
sergeysmirnov Jul 17, 2007 2:37 AM (in response to hefeng)I hope, you are not going to change the content type of ajax response. It is impossible by definition.
-
2. Re: how to set the contenttype in reponse header under the a
hefeng Jul 17, 2007 3:44 AM (in response to hefeng)Hi, SergeySmirnov
My case is to press a button to export some data as a CSV file in client side. Could you give me some suggestion about its implementation?
Currently, I used the following way to do it, but the browser open the CSV file directly instead of showing a dialog to ask the download location.FacesContext facesContext = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse(); String contentType = "application/octet-stream;charset=UTF-8"; response.setContentType(contentType); String buffer ="aaa,bbb,ccc,ddd,eee,aaaaaaaaaaa"; String filename ="my.csv"; response.setHeader("Content-Disposition","attachment;filename=\""+ filename + "\""); OutputStream responseStream = ((HttpServletResponse)facesContext.getExternalContext().getResponse()).getOutputStream(); if (null == responseStream) throw new AbortProcessingException("responseStream is null"); responseStream.write(buffer.getBytes()); responseStream.flush(); responseStream.close(); facesContext.responseComplete();
The header of my response was as followingContent-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: http://localhost:8080/icc-statistics/pages/tree16.jsf Content-Length: 295 Cookie: JSESSIONID=A44D0BB2517414C90957D3AD94D6978A Pragma: no-cache Cache-Control: no-cache AJAXREQUEST=_viewRoot&toolBarForm%3Afrom_date.day=&toolBarForm%3Afrom_date.month=-1&toolBarForm%3Afrom_date.year=&toolBarForm%3Ato_date.day=&toolBarForm%3Ato_date.month=-1&toolBarForm%3Ato_date.year=&com.sun.faces.VIEW=_id1%3A_id3&toolBarForm=toolBarForm&toolBarForm%3A_id41=toolBarForm%3A_id41& HTTP/1.x 200 OK Server: Apache-Coyote/1.1 content-disposition: attachment;filename="my.csv" Content-Type: application/octet-stream;charset=UTF-8 Content-Length: 31
-
3. Re: how to set the contenttype in reponse header under the a
hefeng Jul 17, 2007 3:47 AM (in response to hefeng)Another way I want to try is forward the requestion from Back Bean to a servlet to handle the export action. But I also have the problem with getWriter from response.
Does this way is possible? What's the right way to implement this case in Ajax4Faces framework? -
4. Re: how to set the contenttype in reponse header under the a
hefeng Jul 17, 2007 4:58 AM (in response to hefeng)I got some interesting result of my question.
In order to show Open/Save dailog to download file from server, user should use<h:commandLink id="link1" value="download2" action="#{bean.download}" />
rather than use<a4j:commandButton action="#{bean.download}" value="download1" />
In the case of using <a4j:commandButton/> or <a4j:commandLink/>, the download file will be automatically opened by browser instead of showing Open/Save dialog.
Here is my back bean.public void download() throws IOException{ FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = ( HttpServletResponse ) context.getExternalContext().getResponse(); String buffer = "aaaaaaaaaaaaa"; response.setContentType("application/x-download"); response.setHeader("Content-Disposition", "attachment;filename=\"" + "aaa.csv" + "\""); OutputStream os = null; os = response.getOutputStream(); os.write(buffer.getBytes()); os.flush(); os.close(); FacesContext.getCurrentInstance().responseComplete(); }
Referenced from http://wiki.apache.org/myfaces/Sending_Files
Here is the HTTP Response's header of two tags:HTTP Response's header of using <h:commandLink/> POST /myapp/pages/download.jsf HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost:8080/myapp/pages/download.jsf Cookie: JSESSIONID=18A9C87EA2BBEA2C298D51B59139ADE9 Content-Type: application/x-www-form-urlencoded Content-Length: 66 com.sun.faces.VIEW=_id1%3A_id2&_id2=_id2&_id2%3A_idcl=_id2%3Alink1 HTTP/1.x 200 OK Server: Apache-Coyote/1.1 content-disposition: attachment;filename="aaa.csv" Content-Type: application/x-download;charset=ISO-8859-1 Content-Length: 13
HTTP Response's header of using <a4j:commandButton/> POST /myapp/pages/download.jsf HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: http://localhost:8080/myapp/pages/download.jsf Content-Length: 101 Cookie: JSESSIONID=18A9C87EA2BBEA2C298D51B59139ADE9 Pragma: no-cache Cache-Control: no-cache AJAXREQUEST=_viewRoot&com.sun.faces.VIEW=_id1%3A_id2&_id2=_id2&_id2%3A_idcl=&_id2%3A_id3=_id2%3A_id3& HTTP/1.x 200 OK Server: Apache-Coyote/1.1 content-disposition: attachment;filename="aaa.csv" Content-Type: application/x-download;charset=ISO-8859-1 Content-Length: 13