This is what I'm doing.  YMMV and assorted disclaimers; it's quite
likely that this can be improved upon.

(1) I generate this place-holder for the file download in my GWT web
pages:

        out.println("<div id=\"__gwt_downloadFrame\" tabIndex='-1'></
div>");

(2) To initiate a download from the client side, I do this:

    public static void download(String p_uuid, String p_filename)
    {
        String fileDownloadURL = "/fileDownloadServlet"
                               + "?id=" + p_uuid
                               + "&filename=" +
URL.encode(p_filename);
        Frame fileDownloadFrame = new Frame(fileDownloadURL);
        fileDownloadFrame.setSize("0px", "0px");
        fileDownloadFrame.setVisible(false);
        RootPanel panel = RootPanel.get("__gwt_downloadFrame");
        while (panel.getWidgetCount() > 0)
            panel.remove(0);
        panel.add(fileDownloadFrame);
    }

(3) The corresponding FileDownloadServlet does this (with unimportant
details omitted):

    @Override
    protected void doGet(HttpServletRequest p_request,
                         HttpServletResponse p_response)
        throws ServletException, IOException
    {
        String filename = p_request.getParameter("filename");
        if (filename == null)
        {
            p_response.sendError(SC_BAD_REQUEST, "Missing filename");
            return;
        }

        File file = /* however you choose to go about resolving
filename */

        long length = file.length();
        FileInputStream fis = new FileInputStream(file);
        p_response.addHeader("Content-Disposition",
                             "attachment; filename=\"" + filename +
"\"");
        p_response.setContentType("application/octet-stream");
        if (length > 0 && length <= Integer.MAX_VALUE);
            p_response.setContentLength((int)length);
        ServletOutputStream out = p_response.getOutputStream();
        p_response.setBufferSize(32768);
        int bufSize = p_response.getBufferSize();
        byte[] buffer = new byte[bufSize];
        BufferedInputStream bis = new BufferedInputStream(fis,
bufSize);
        int bytes;
        while ((bytes = bis.read(buffer, 0, bufSize)) >= 0)
            out.write(buffer, 0, bytes);
        bis.close();
        fis.close();
        out.flush();
        out.close();
    }

That all causes the selected file to be downloaded to the client
browser in whatever way the browser chooses to handle downloads.

On Oct 19, 8:49 pm, mike b <[email protected]> wrote:
> I have read all the other posts about downloading Excel files and how
> to do it w/ an IFRAME, with RequestBuilder, and Window.open().
> However, none of them actually work.  Luckily, I have a working
> servlet which executes and returns successfully with javascript.
> However, we'd like to do it all in GWT.  The error message from IE is
> below.  The Window.open() DOES work with FF, but not with IE.
> Unfortunately, we must deploy to IE, no options there.
>
> Situation:
> GWT 2.0.4  mvp4g 1.2.0
> Need to download a file to open in Excel.  At this point, its actually
> a text file, but the MIME type is setup for Excel.
>
> The servlet has been tested w/ straight java script using
> "document.body.appendChild(iframe);".  This works like a champ in IE
> and FF.
>
> However, when I do "Window.open(url, "_self",null);" in GWT, IE can't
> download the file.  It throws an error saying...
>
> "
> Internet Exploroer cannot download MyFile from localhost
>
> IE was not able to open this Internet site.  The requests site is
> either unavailable or cannot be found.  Please try again later.
> "
>
> In GWT, I have also tried just using a Frame, adding it to a Panel,
> and then calling myFrame.setUrl("myUrl");
>
> This also successfully gets to the servlet, but fails w/ the above
> error message while trying to "open" the file.
>
> It seems as if GWT is telling the browser to cancel the download when
> it pops up.
>
> Any suggestions?  Any guesses?
>
> Thanks,
> mikeb

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to