尝试从GWT应用程序下载文件时出现奇怪的EOF异常
我正在尝试从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应用程序下载文件时出现奇怪的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下载文件 在服务器端:
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;
希望有帮助:-