浏览器保存文件出现问题, 请各位达人帮忙, 谢谢!

wssgwps 2007-10-17 09:06:02
我在网上找了个在客户端保存服务器上文件的例子如下:
<%@ page import="java.io.*"%>
<%
String filepath = (String)request.getAttribute("url");
String filename = (String)request.getAttribute("filename");
if(filepath == null)
out.print("<b>can not open null file</b>");
File file = new File(session.getServletContext().getRealPath("/") + "/" +filepath);
FileInputStream fis = new FileInputStream(file);
int i = 0;
response.setContentType("Application/octec-stream");
response.setHeader("content-disposition", "attachment;filename=" + filename);
//int j = 0;
while((i = fis.read()) != -1)
{
out.write(i);
//if(j++ < 2)
//System.out.println(i);
}

fis.close();
out.close();
%>

目前程序工作不正常, 每个被保存的文件比实际文件多出2个字节的内容(OD OA), 比如说我有一个a.rar他实际开头的2个字节应该是:0X52 0X61
但当我保存到客户端时, 前两个字节变成了0XOD 0XOA, 接下来才是0X52 0X61.
我不知道这多余的两个字节从何而来, 我将上面的注释去掉, 在控制台打印前两个字节得到的结果是:0X52 0X61, 这正是我期望的字节序列, 可是当我保存
到客户端怎么就多出两个字节0XOD 0XOA呢?

请各位大哥帮忙看看, 给出具体方案.
分不够可以加, 谢谢!
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wssgwps 2007-10-24
  • 打赏
  • 举报
回复
谢谢各位的帮助, 现在结帖!
wssgwps 2007-10-17
  • 打赏
  • 举报
回复
偶还是没能解决问题, 不过我找到了另外一种方法, 可以搞定文件下载. 把代码贴出来,希望对大家有帮助!
<%@page import="java.net.*"%>
<%

response.setContentType("application/x-download");
String filedownload = (String)request.getAttribute("url");
if(filedownload == null)
out.print("<b>can not open null file</b>");

String filedisplay = (String)request.getAttribute("filename");
String filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);

try
{
RequestDispatcher dis = application.getRequestDispatcher(filedownload);
if(dis!= null) {
dis.forward(request,response);
}
response.flushBuffer();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
out.clear();
out = pageContext.pushBody();
}
%>
silver_zhao 2007-10-17
  • 打赏
  • 举报
回复
就是换行、回车这些多余的字符,这些应该不碍事的
shadao 2007-10-17
  • 打赏
  • 举报
回复
flush好像不是这个用吧

感觉是应该输出流已经写了些东西了
对response 使用resetBuffer()方法试试
for_cyan 2007-10-17
  • 打赏
  • 举报
回复
OD OA 其实就是ascii中的\r\n,也就是换行
你在写入前,先将out清空试试看,并且将fis文件输入流也进行处理,先清楚前两个字节
然后写入
out.flush();

out.flush();
while((i = fis.read()) != -1)
{
out.write(i);
//if(j++ < 2)
//System.out.println(i);
}

out.flush();
fis.close();
out.close();

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧