Thanks, I've wanted to do this for some time and I appreciate the Wiki
reference. I wrote some simple wrapper methods to assist and perhaps they'll
help others.

I tried using HSSFWorkbook.getBytes[] and writing a sendByteArray(byte[],
String) method but Excel had problems consuming the response.  So I used
HSSFWorkbook.write(ByteArrayOutputStream) and then converted the
ByteArrayOutputStream back to a byte array and it worked fine.

  /**
   * this just shows my calling context
   */
  public void createSpreadSheet(ActionEvent ae) {                 
   if (list != null && list.size() > 0) {
     try {
       HSSFWorkbook wb = createHSSFWorkbook(list, title);
       String fileName =
FileUtils.getTimestampedFileName(Session.getCurrentInstance().getUserName(),
"xls");
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       wb.write(bos);
       bos.close();
       ServletUtils.sendOutputStream(bos, fileName);
       _Logger.log(Level.INFO,"Writing "+fileName+" to
response.outputStream");
     } catch (Exception e) {
       _Logger.log(Level.WARNING, e.getLocalizedMessage());
     }
   }
  }

--------------- UTILITY METHODS ------------------
  /**
   * Gets the current ServletContext from the FacesContext in a null safe
manner.
   * @return the current ServletContext
   */
  public static ServletContext getServletContext() {
    ServletContext sc = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    if (fc != null) {
      ExternalContext ec = fc.getExternalContext();
      if (ec != null) {
        sc = (ServletContext)ec.getContext();
      }
    }
    return sc;
  }

  /**
   * Just a wrapper for [EMAIL PROTECTED] ServletContext#getMimeType(String)
ServletContext.getMimeType()}
   * @param fileName
   * @return the mime type
   * @see ServletContext#getMimeType(String)
   */
  public static String getMimeType(String fileName) {
    String mimeType = null;
    ServletContext context = ServletUtils.getServletContext();
    if (context != null) {
      mimeType = context.getMimeType(fileName);
    }
    return mimeType;
  }

  /**
   * Sends the OutputStream contents to the client using
<code>fileName</code> to determine the mime type.
   * @param baos an OutputStream that is castable to a ByteArrayOutputStream
   * @param fileName a file name to include in the response header
   * @throws IOException
   * @see #getMimeType(String)
   * @see #sendFile(String)
   */
  public static void sendOutputStream(OutputStream baos, String fileName)
throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    if (context != null) {
      HttpServletResponse response =
(HttpServletResponse)context.getExternalContext().getResponse();
      if (response != null) {
        String contentType = ServletUtils.getMimeType(fileName);
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" +
fileName + "\"");
        OutputStream os = response.getOutputStream();
        byte[] bytes = ((ByteArrayOutputStream)baos).toByteArray();
        if (os != null) {
          os.write(bytes);
          os.flush();
          os.close();
        }
      }
      FacesContext.getCurrentInstance().responseComplete();
    }
  }

  /**
   * Sends the contents of <code>filePath</code> to the client using
<code>filePath</code> to determine the mime type.
   * @param filePath an absolute path to a file
   * @throws IOException
   * @see #sendOutputStream(OutputStream, String)
   */
  public static void sendFile(String filePath) throws IOException {
    String folder = FileUtils.getParentFolder(filePath);
    String fileName = FileUtils.getName(filePath);
    FacesContext context = FacesContext.getCurrentInstance();
    if (context != null) {
      HttpServletResponse response =
(HttpServletResponse)context.getExternalContext().getResponse();
      if (response != null) {
        String contentType = ServletUtils.getMimeType(fileName);
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", "attachment;filename=\"" +
fileName + "\"");
        FileInputStream fis = null;
        OutputStream os = null;
        fis = new FileInputStream(new File(folder, fileName));
        if (fis != null) {
          os = response.getOutputStream();
          if (os != null) {
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = fis.read(bytes)) != -1) {
              os.write(bytes, 0, read);
            }
            os.flush();
            os.close();
          }
        }
        FacesContext.getCurrentInstance().responseComplete();
      }
    }
  } 

-----Original Message-----
From: Mike Kienenberger [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, February 06, 2007 4:19 PM
To: MyFaces Discussion
Subject: Re: return pdf from database blob?

http://wiki.apache.org/myfaces/Sending_Files

On 2/6/07, Mick Knutson <[EMAIL PROTECTED]> wrote:
> I want to have a table of pdf documents in my database that I want to 
> return to my web users. Is there an example of having a MyFaces jsp 
> return pdf document verse html?
>
> --
> ---
> Thanks,
> Mick Knutson
>
> http://www.baselogic.com
> http://www.blincmagazine.com
> http://www.djmick.com
>  http://www.myspace.com/djmick_dot_com
> http://www.thumpradio.com
> ---




Reply via email to