为什么jsp显示从数据库里longraw字段生成的word文档是二进制流?

xjluoffzhang 2003-10-17 03:38:45
我在jsp界面想直接显示从数据库里longraw字段生成的word文档,可是显示的是二进制流,而同样的代码从数据库里longraw字段生成的word文档写在磁盘上却是正常的?
jsp代码如下:
<%@ page import="javax.sql.RowSet"%>
<%@ page import="java.io.*"%>
<jsp:useBean id="comm" scope="session" class="ustc.tools.pub.comm" />
<jsp:useBean id="mCtlLongRawBean" scope="session" class="soft.tm.web.CtlLongRawBean" />
<%
RowSet rs=null;
String sSQL="select * from pstar.test_clob where id='97982'";
rs=comm.getRowSet(sSQL);
while(rs.next())
{
byte[] buffer = new byte[8 * 1924];
int bytesRead = 0;
int byteSum = 0;
String myfileName = "bb.doc";
InputStream is = rs.getBinaryStream("clobcol");
OutputStream fos=response.getOutputStream();
while ((bytesRead = is.read(buffer)) != -1)
{
byteSum += bytesRead;
fos.write(buffer, 0, bytesRead);
}
fos.close( );
response.setContentType("application/msword");
response.setHeader("Content-Disposition","attachment; filename=" + myfileName);
rs.close();
}
//mCtlLongRawBean.ReadLongRawToWord();
%>
写磁盘的代码如下:
public void ReadLongRawToWord(){
try{
int bytesRead = 0;
int byteSum = 0;
byte[] buffer = new byte[8 * 1924];
FileOutputStream fos = new FileOutputStream("c:\\te333t.doc");
PreparedStatement ps = conn.prepareStatement("select * from pstar.test_clob where id='97982'");
ResultSet rs = ps.executeQuery();
if (rs != null)
{
while(rs.next())
{
InputStream is = rs.getBinaryStream("clobcol");
while ((bytesRead = is.read(buffer)) != -1)
{
byteSum += bytesRead;
fos.write(buffer, 0, bytesRead);
}
fos.close( );
}
rs.close( );
}
ps.close( );
}
catch(Exception e) {
System.err.print("文件读失败"+e.getMessage());
}
}
...全文
90 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alan 2003-10-18
  • 打赏
  • 举报
回复
是的,所谓设置MIME只是让浏览器自动调用相应的程序打开文件。
也就是说你在设置MIME后,所有*.doc可以调用office word在浏览器中打开。
在你从数据库中读取数据时,得到的是二进制流而不是doc文件,因此浏览器看到的是乱嘛。
xjluoffzhang 2003-10-17
  • 打赏
  • 举报
回复
我在web.xml中加入了<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>

<mime-mapping>
<extension>xls</extension>
<mime-type>application/msexcel</mime-type>
</mime-mapping>

<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
可还是显示二进制文件,是不是jsp就不能直接显示数据库里面读出来的word文件,
而只能用后面的方法?
而且显示完二进制后还报错:getOutputStream() has already been called
Alan 2003-10-17
  • 打赏
  • 举报
回复
如上所述,你直接从数据库中读取word的二进制流是无法正常在页面上显示的(word本身在编辑时会在文件中插入无数的自定义符号),也无法还原。
一个方法是将数据库读取的数据保存成*.doc文件在由ie读取
另一方法,文件上传到服务器,而你的数据库中只存储相应的文件名和路径。
Alan 2003-10-17
  • 打赏
  • 举报
回复
word文件本身就是二进制文件
你存在存储介质上的word文件由操作系统负责调用相应的程序读取,正常的比如office word.
当你用note book打开该文件则是乱麻(二进制)。
ie显示word同理,如果不设置MIME则无法自动调用正确的读取程序。
因此页面上显示的是乱码
在读取类似文件时(doc\xls\pdf等)应在应用服务器设置MIME,以便自动调用相应的程序。
例如web.xml中如下设置
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>

<mime-mapping>
<extension>xls</extension>
<mime-type>application/msexcel</mime-type>
</mime-mapping>

<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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