You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by de...@struts.apache.org on 2004/11/26 09:03:16 UTC

[Apache Struts Wiki] New: StrutsFileDownload

   Date: 2004-11-26T00:03:16
   Editor: NiallPemberton <ni...@apache.org>
   Wiki: Apache Struts Wiki
   Page: StrutsFileDownload
   URL: http://wiki.apache.org/struts/StrutsFileDownload

   no comment

New Page:

= File Download =

A new DownloadAction was added in Struts 1.2.6 (see the[http://struts.apache.org/api/org/apache/struts/actions/DownloadAction.html JavaDoc]). This page is to show how to use it and has the following structure:

 * Implementing a DownloadAction
    * Implement the getStreamInfo() Method 
    * Implement the getBufferSize() Method
 * Examples
    * FileStreamInfo Example 
    * ResourceStreamInfo Example 
    * Bye Array Example 
 * Using the DownloadAction in you Web Pages


(niallp: Since I haven't actually used this class myself, I'm hoping that Martin, Frank or anyone else involved in the discussion/creation of this would take a look here to see if its OK)

== Implementing a DownloadAction ==

You need to extend org.apache.struts.actions.DownloadAction and implement the getStreamInfo() method. Optionally you can also override the getBufferSize() method if you require a different buffer size from the default.

=== Implement the getStreamInfo() Method ===

The getStreamInfo() method returns a StreamInfo object - which is an inner interface of the DownloadAction. The DownloadAction provides two concrete implementations (static inner classes) of the StreamInfo interface:

 * FileStreamInfo - Simplifies downloading of a file from disk - need to pass a java.io.File object to the constructor along with the content type.
 * ResourceStreamInfo - simplifies downloading of a web application resource - need to pass the ServletContext, path and content type to its constructor.

In the examples below, I have also provided a Byte array implementation of the StreamInfo interface.

=== Implement the getBufferSize() Method ===

The DownloadAction, by default, returns a buffer size of 4096. Optionally, this may be overriden to customize the size of the buffer used to transfer the file.

== Examples ==

Below are three examples:
 * using a File
 * using a web application resource
 * using a byte array.

=== FileStreamInfo Example ===

Example of using the DownloadAction with a file. This example picks up the file name from the ''parameter'' attribute in the strust-config.xml action mapping.

{{{
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleFileDownload extends DownloadAction{

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "pdf" file - gets the file name from the
        // Action Mapping's parameter
        String contentType = "application/pdf";
        File file          = new File(mapping.getParameter());

        return new FileStreamInfo(contentType, file);
        
    }

}

}}}

=== ResourceStreamInfo Example ===

Example of using the DownloadAction with a web application resource. This example picks up the web application resource path from the ''parameter'' attribute in the strust-config.xml action mapping.


{{{

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleResourceDownload extends DownloadAction {

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "jpeg" file - gets the file name from the
        // Action Mapping's parameter
        String contentType         = "image/jpeg";
        String path                = mapping.getParameter();
        ServletContext application = servlet.getServletContext();
        
        
        return new ResourceStreamInfo(contentType, application, path);
        
    }

}


}}}

=== Byte Array Example ===

Example of using the DownloadAction with a Byte Array.

This example creates a ByteArrayStreamInfo inner class which implements the StreamInfo interface.

(niallp: IMO we should include this ByteArrayStreamInfo in the implementation)

{{{
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;

public class ExampleByteArrayDownload extends DownloadAction {

    protected StreamInfo getStreamInfo(ActionMapping mapping, 
                                       ActionForm form,
                                       HttpServletRequest request, 
                                       HttpServletResponse response)
            throws Exception {
        
        // Download a "pdf" file
        String contentType = "application/pdf";
        byte[] myPdfBytes  = null;              // Get the bytes from somewhere

        return new ByteArrayStreamInfo(contentType, myPdfBytes);
        
    }

    protected class ByteArrayStreamInfo implements StreamInfo {
        
        protected String contentType;
        protected byte[] bytes;
        
        public ByteArrayStreamInfo(String contentType, byte[] bytes) {
            this.contentType = contentType;
            this.bytes = bytes;
        }
        
        public String getContentType() {
            return contentType;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(bytes);
        }
}

}}}


== Using the DownloadAction in you Web Pages ==

The last bit of the puzzle is how do I use this action? 

You need to do two things:

 * As with any Struts action, you need to configure it in the struts-config.xml
 * Use it on your web page like any other link to a file

So for example you might have something like the following in your struts-config.xml:

{{{

    <action path="/downloadMyPdfFile" type="myPackage.ExampleFileDownload" parameter="/foo/bar.pdf">
    <action path="/downloadMyImage"   type="myPackage.ExampleResourceDownload" parameter="/images/myImage.jpeg">

}}}

The on your jsp page, you might use these in the following way:

{{{
    <html:img action="downloadMyImage" alt="My Image" height="400" width="400"/>

    <html:link action="downloadMyPdfFile">Click Here to See the PDF</html:link>

}}}


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org