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.