I'm sorry. My reply was from memory. I used the
action listener tag inside of a command link. Here's
the snippet:
<h:commandLink value="#{file}" action="downloadfile">
<h:outputText value="#{file}">
<jsf:converter converterId="FileNameConverter"/>
</h:outputText>
<jsf:actionListener
type="pamcep.jsf.event.RetrieveFile"/>
</h:commandLink>
The version I used this with is 1.03.
--- [EMAIL PROTECTED] wrote:
> Thanks for responding Aris,
>
> I have implemented what you suggested and am still
> getting the same problem
> (note I am using MyFaces 1.0.7). Have I implemented
> it below the way you
> have it? I put an actionListener on my commandLink
> and use an ActionEvent
> method to capture the line of the dataTable that
> they selected. I then call
> writeFileToBrowser and at the end specify
>
FacesContext.getCurrentInstance().responseComplete().
>
> Do you see where I may have something wrong?
>
> <h:commandLink
> actionListener="#{DocumentCtl.downloadPDF}"
> immediate="true">
> <h:outputText value="view" styleClass="copy"/>
> </h:commandLink>
>
> public void downloadPDF(ActionEvent event) {
> Document doc = (Document)
> UIHelper.getReqMapObj("document");
> String file =
> Sysctl.getRecord().getLowresfolder() + doc.getGuid()
> +
> ".pdf";
> writeFileToBrowser(file, doc.getName() +
> ".pdf",
> doc.getUploadtype());
> }
>
> private void writeFileToBrowser(String
> fileSource, String downloadName,
> String contentType) {
>
> if
>
(!FacesContext.getCurrentInstance().getResponseComplete()
> && FileControl.exists(fileSource)) {
>
> HttpServletResponse response =
> (HttpServletResponse)
> FacesContext.getCurrentInstance()
>
> .getExternalContext().getResponse();
> response.setContentType(contentType);
>
> response.setHeader("Content-Disposition",
> "attachment;filename=\"" + downloadName
> + "\"");
>
> try {
> ServletOutputStream out =
> response.getOutputStream();
> BufferedInputStream
> bufferedinputstream = new
> BufferedInputStream(
> new
> FileInputStream(fileSource));
>
> byte abyte0[] = new byte[4096];
> int i;
> while ((i =
> bufferedinputstream.read(abyte0, 0, 4096)) !=
> -1)
> out.write(abyte0, 0, i);
>
> out.flush();
> out.close();
>
>
>
FacesContext.getCurrentInstance().responseComplete();
> } catch (IOException ex) {
> ex.printStackTrace();
> }
> }
> }
>
>
>
>
> -----Original Message-----
> From: Aris Bartee [mailto:[EMAIL PROTECTED]
> Sent: Saturday, April 23, 2005 9:05 AM
> To: MyFaces Discussion
> Subject: Re: Download file from browser problem -
> two clicks
>
> I wrapped my download code in an event method:
> foo(ActionEvent event). The immediate attribute for
> the uicommand tag should be true.
> --- Aaron Bartell <[EMAIL PROTECTED]> wrote:
> > Below is the problem I am still having that I am
> > wondering if anyone has
> > found a solution to. Is there a way to make it so
> > the user doesn't have to
> > click on the same link twice after a file download
> > has occurred? Almost
> > seems like something in the JSF lifecycle isn't
> > completing correctly. I am
> > returning null from action method of the link
> > clicked so I stay on the same
> > page. Any thoughts?
> >
> >
> >
> > Thanks,
> >
> > Aaron Bartell
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > Here is how I have done it based on things I have
> > found on the net. The nice
> > thing about streaming it to the browser is that
> the
> > file need not exist in
> > your context, it can be anywhere on the file
> system.
> > The only bummer is that
> > this seems to create a problem after the user
> > downloads. Any button or link
> > that they click after I do the .responseComplete()
> > it doesn't work the first
> > time. But the second time they click the button or
> > link it executes the
> > appropriate code. I am open to suggestions on any
> > errors in my code to fix
> > that problem...
> >
> >
> >
> >
> > private void writeFileToBrowser(String fileSource,
> > String downloadName,
> > String contentType) {
> >
> > if
> >
>
(!FacesContext.getCurrentInstance().getResponseComplete()
> > &&
> > FileControl.exists(fileSource)) {
> >
> > HttpServletResponse response =
> (HttpServletResponse)
> > FacesContext.getCurrentInstance()
> > .getExternalContext().getResponse();
> > response.setContentType(contentType);
> > response.setHeader("Content-Disposition",
> > "attachment;filename=\"" +
> > downloadName + "\"");
> >
> > try {
> > ServletOutputStream out =
> > response.getOutputStream();
> > BufferedInputStream bufferedinputstream = new
> > BufferedInputStream(new
> > FileInputStream(
> > fileSource));
> >
> > byte abyte0[] = new byte[4096];
> > int i;
> > while ((i = bufferedinputstream.read(abyte0, 0,
> > 4096)) != -1)
> > out.write(abyte0, 0, i);
> >
> > out.flush();
> > out.close();
> >
> >
> >
> >
> >
>
FacesContext.getCurrentInstance().responseComplete();
> > } catch (IOException ex) {
> > ex.printStackTrace();
> > }
> > }
> > }
> >
> >
> >
> > public static boolean exists(String fileSource)
> {
> > File f = new File(fileSource);
> > return f.exists();
> > }
> >
> >
> >
> > HTH,
> > Aaron Bartell
> >
> >
> >
> >
> >
> >
> > Patrick B Haggood wrote:
> >
> >
> >
> > Anyone have an example of downloading using
> MyFaces?
> > I see on the
> > sample you can use outputtext components, but
> that's
> > using the real
> > filename (which I keep in a datastore to guard
> > against duplicate
> > filenames; the system assigns new filename,
> > FILE0002, FILE0003, etc
> > apon upload)
> >
> >
> >
> > Thanks!
> >
> >
> >
> >
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam
> protection around
> http://mail.yahoo.com
>
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com