尝试从GWT应用程序下载文件时出现奇怪的EOF异常

尝试从GWT应用程序下载文件时出现奇怪的EOF异常,gwt,ioexception,eofexception,Gwt,Ioexception,Eofexception,我正在尝试从GWT客户端下载一个文件。在服务器端有一个servlet,它根据请求生成文件内容并将其发送回客户端 测试场景: 场景1若我直接点击servlet的url,它总是给我想要的结果,并没有任何问题 情景2 使用IE8上的GWT客户端,我能够下载文件而不需要任何代码更改。然而,在其他一些计算机上,当我尝试在响应输出流上写入文件内容时,我得到了EOF异常 org.mortbay.jetty.eofeexception 位于org.mortbay.jetty.HttpGenerator.flus

我正在尝试从GWT客户端下载一个文件。在服务器端有一个servlet,它根据请求生成文件内容并将其发送回客户端

测试场景: 场景1若我直接点击servlet的url,它总是给我想要的结果,并没有任何问题

情景2 使用IE8上的GWT客户端,我能够下载文件而不需要任何代码更改。然而,在其他一些计算机上,当我尝试在响应输出流上写入文件内容时,我得到了EOF异常

org.mortbay.jetty.eofeexception 位于org.mortbay.jetty.HttpGenerator.flushHttpGenerator.java:760 位于org.mortbay.jetty.AbstractGenerator$Output.flushAbstractGenerator.java:566 位于org.mortbay.jetty.HttpConnection$Output.flushHttpConnection.java:911 位于java.io.BufferedOutputStream.flushUnknown Source atxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.doGetServiceDataExporterServlet.java:110 位于javax.servlet.http.HttpServlet.serviceHttpServlet.java:617 在javax.servlet.http.HttpServlet.serviceHttpServlet.java:717创建输入流

servlet的代码如下:

试一试 { output=new BufferedOutputStreamresponse.getOutputStream,默认缓冲区大小; 字节[]缓冲区=新字节[默认缓冲区大小]; 整数长度; int字节数=0; 而length=data.readbuffer>0{ 字节写入+=长度; output.writebuffer,0,长度; } output.flush//此时我面临EOF异常。 其中数据是inputStream 通过BytesWrite变量,我确认在所有三个场景中,内容都以相同的方式写入输出流。但不确定为什么它在某些计算机中不起作用


任何一点都将受到高度重视。

我会这样做,用GWT下载文件

在服务器端:

public static void sendFileToClient(String path, String filename,
        int contentLen, HttpServletRequest request,
        HttpServletResponse response) throws UnsupportedEncodingException
{
    String ua = request.getHeader("User-Agent").toLowerCase();
    boolean isIE = ((ua.indexOf("msie 6.0") != -1) || (ua
            .indexOf("msie 7.0") != -1)) ? true : false;

    String encName = URLEncoder.encode(filename, "UTF-8");

    // Derived from Squirrel Mail and from
    // http://www.jspwiki.org/wiki/BugSSLAndIENoCacheBug
    if (request.isSecure())
    {
        response.addHeader("Pragma", "no-cache");
        response.addHeader("Expires", "-1");
        response.addHeader("Cache-Control", "no-cache");
    }
    else
    {
        response.addHeader("Cache-Control", "private");
        response.addHeader("Pragma", "public");
    }

    if (isIE)
    {
        response.addHeader("Content-Disposition", "attachment; filename=\"" + encName + "\"");
        response.addHeader("Connection", "close");
        response.setContentType("application/force-download; name=\"" + encName + "\"");
    }
    else
    {
        response.addHeader("Content-Disposition", "attachment; filename=\""
                + encName + "\"");
        response.setContentType("application/octet-stream; name=\""
                + encName + "\"");
        if (contentLen > 0)
            response.setContentLength(contentLen);
    }

    try
    {
        FileInputStream zipIn = new FileInputStream(new File(path));

        ServletOutputStream out = response.getOutputStream();
        response.setBufferSize(8 * 1024);
        int bufSize = response.getBufferSize();
        byte[] buffer = new byte[bufSize];

        BufferedInputStream bis = new BufferedInputStream(zipIn, bufSize);

        int count;
        while ((count = bis.read(buffer, 0, bufSize)) != -1)
        {
            out.write(buffer, 0, count);
        }
        bis.close();
        zipIn.close();

        out.flush();
        out.close();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("File not found");
    }
    catch (IOException e)
    {
        System.out.println("IO error");
    }
}
我有一个servlet,它需要一个id,然后我得到相关的文件路径,并使用上面的代码将其提供给浏览器

在客户端:

public class DownloadIFrame extends Frame implements LoadHandler,
        HasLoadHandlers
{
    public static final String DOWNLOAD_FRAME = "__gwt_downloadFrame";

    public DownloadIFrame(String url)
    {
        super();
        setSize("0px", "0px");
        setVisible(false);
        RootPanel rp = RootPanel.get(DOWNLOAD_FRAME);
        if (rp != null)
        {
            addLoadHandler(this);
            rp.add(this);
            setUrl(url);
        }
        else
            openURLInNewWindow(url);
    }

    native void openURLInNewWindow(String url) /*-{
        $wnd.open(url);
    }-*/;

    public HandlerRegistration addLoadHandler(LoadHandler handler)
    {
        return addHandler(handler, LoadEvent.getType());
    }

    public void onLoad(LoadEvent event)
    {
    }
}
在托管页面中添加此Iframe

然后,要下载文件,请输入以下内容:

    btnDownload.addClickHandler(new ClickHandler()
        {
            public void onClick(ClickEvent arg0)
            {
                String url = GWT.getModuleBaseURL()
                        + "/downloadServlet?id=[FILE_ID]";
                new DownloadIFrame(url);
            }
        });
我希望这对你有帮助

快乐的编码!

如果InputStream关闭后OutputStream刷新,也会发生这种情况,如下所示: myInputStream.close; myOutputStream.flush; myOutputStream.close; 应该是这样的: myOutputStream.flush; myInputStream.close; myOutputStream.close; 希望有帮助:-