Forums

Home » Liferay Portal » English » 3. Development

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Thiago Esteves
output txt and xls files from struts action of a portlet
August 10, 2009 9:12 AM
Answer

Thiago Esteves

Rank: Junior Member

Posts: 31

Join Date: June 24, 2009

Recent Posts

Hello,

I'm trying to output txt and xls files from an action of my portlet but I've been experiencing some difficulties. Does somebody know how to do that?

From a default struts application it would be done by this code:

 1
 2public ActionForward execute(ActionMapping mapping, ActionForm form,
 3            HttpServletRequest request, HttpServletResponse response)
 4            throws Exception {
 5
 6File file = new File("D:\\xxx.txt");
 7        response.setContentType("application/octet-stream");
 8        response.setHeader("Content-Disposition", "attachment;filename=myFile.xls");
 9        response.setContentLength((int) file.length());
10        OutputStream out = response.getOutputStream();
11        FileInputStream istr = null;
12        try {
13
14            istr = new FileInputStream(file);
15            int curByte = -1;
16            while ((curByte = istr.read()) != -1) {
17                out.write(curByte);
18            }
19            out.flush();
20        } catch (Exception ex) {
21            ex.printStackTrace(System.out);
22        } finally {
23            try {
24                if (istr != null)
25                    istr.close();
26            } catch (Exception ex) {
27                System.out.println("Major Error Releasing Streams: "
28                        + ex.toString());
29            }
30        }
31        try {
32            response.flushBuffer();
33        } catch (Exception ex) {
34            System.out.println("Error flushing the Response: " + ex.toString());
35        }
36
37        return null;
38}


But in the processAction and render methods I can't access the HttpServletResponse object.


thanks
Thiago Esteves
RE: output txt and xls files from struts action of a portlet
August 10, 2009 12:25 PM
Answer

Thiago Esteves

Rank: Junior Member

Posts: 31

Join Date: June 24, 2009

Recent Posts

Ok.. that works.. but I it don't display the "save as" dialog.

 1
 2    public ActionForward render(ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
 3            RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {
 4
 5    //    renderResponse.setContentType("application/vnd.ms-excel; charset=UTF-8");
 6        //renderResponse.setContentType("text/plain; charset=UTF-8");
 7       
 8        //ResourceURL resURL = renderResponse.createResourceURL();
 9       
10        HttpServletResponse httpRes =
11            ((RenderResponseImpl)renderResponse).getHttpServletResponse();
12        httpRes.setHeader ("Content-Disposition", "attachment; filename=consulta-001.txt");
13        httpRes.setContentType("application/force-download");
14        httpRes.setCharacterEncoding("UTF-8");
15       
16    //    renderResponse.setProperty("Content-Disposition", fileAttachment);
17
18       
19        File file = new File("/tmp/" + renderRequest.getPortletSession().getId() + ".txt");
20   
21        //renderResponse.setContentLength((int) file.length());
22   
23        OutputStream out = renderResponse.getPortletOutputStream();
24        FileInputStream istr = null;
25        try {
26
27            istr = new FileInputStream(file);
28            int curByte = -1;
29            while ((curByte = istr.read()) != -1) {
30                out.write(curByte);
31            }
32            out.flush();
33        } catch (Exception ex) {
34            ex.printStackTrace(System.out);
35        } finally {
36            try {
37                if (istr != null)
38                    istr.close();
39            } catch (Exception ex) {
40                System.out.println("Major Error Releasing Streams: "
41                        + ex.toString());
42            }
43        }
44        try {
45            renderResponse.flushBuffer();
46        } catch (Exception ex) {
47            System.out.println("Error flushing the Response: " + ex.toString());
48        }
49       
50        return null;   
51    }


Maybe there's a way to add text/plain in the portlet.xml. But there's other actions and I can't remove the <mime-type>text/html</mime-type>

Take a look at my portlet.xml:

 1
 2<?xml version="1.0"?>
 3
 4<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
 5    <portlet>
 6        <portlet-name>combo1</portlet-name>
 7        <display-name>Combo 1</display-name>
 8        <!-- <portlet-class>br.com.gravames.liferay.portlet.Combo1Portlet</portlet-class> -->
 9        <portlet-class>com.liferay.portlet.StrutsPortlet</portlet-class>
10        <init-param>
11            <name>view-action</name>
12            <value>/combo1/paginaInicial</value>
13        </init-param>
14        <expiration-cache>0</expiration-cache>
15        <supports>
16            <mime-type>text/html</mime-type>
17        </supports>
18        <portlet-info>
19            <title>Combo 1</title>
20            <short-title>Combo 1</short-title>
21            <keywords>combo1,gravames</keywords>
22        </portlet-info>
23        <security-role-ref>
24            <role-name>administrator</role-name>
25        </security-role-ref>
26        <!--
27        <security-role-ref>
28            <role-name>guest</role-name>
29        </security-role-ref>
30        -->
31        <!--
32        <security-role-ref>
33            <role-name>power-user</role-name>
34        </security-role-ref>
35        -->
36        <!--
37        <security-role-ref>
38            <role-name>user</role-name>
39        </security-role-ref>
40        -->
41    </portlet>
42    <custom-window-state>
43        <window-state>exclusive</window-state>
44    </custom-window-state>
45    <custom-window-state>
46        <window-state>pop_up</window-state>
47    </custom-window-state>
48</portlet-app>