如何直接下载保存在Oracl数据库中Blob字段的文件(不生成临时文件)???

急需
最好能不在服务器端生成临时文件直接下载


Blogb b=ResultSet.getBlob(i);
InputStream is=b.getBinaryStream();
然后对这个流进行处理,写入一个文件!

BLOB对象读取
public static void blobRead(String outfile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查询BLOB对象 */
ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");
while (rs.next()) {
/* 取出此BLOB对象 */
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/* 以二进制形式输出 */
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));
BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}

楼主参考下,你没定义content


一般做法是先查出来生成文件,然后下载.
不过jspsmart可以满足楼主要求.你去搜索下,我记得是有现成的例子


谢谢两位
请问二楼的能不能写个完整的例子???
另外三楼的回复是直接从别的贴子贴过来的
并不是我问的问题


你贴出来的方法是将Blob字段的内容生成文件用的
而我想要的是不生成文件
直接下载的方法

Any way
还是很感谢你的热心回复

你的意思是jsp还是用socket?


服务器端是否是你实现?
如果服务器端是你实现,你可以建立socket连接,
将取出的socket连接!
在服务器端监听连接的socket:
ServerSocket s=new ServerSocket(port);
Socket socket=s.accept();
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
现在将取出的blob写入这个out!

不知楼主是否是这个意思?

谢谢thrive_li()的提示
我在网上找到了如下的代码
但是由于我没有限定上传文件的类型
所以还是和我的要求有点差距
请问还有没有更好的方法???

这是下载,进行显示图片


import java.sql.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class DownLoad extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        doPost(request,response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        System.out.println("======DownLoad begin=====");
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.216.0.2:1521:ORCL","test","test");
            Statement stmt=conn.createStatement();
            String id=request.getParameter("id");
            String sql="SELECT id, name, content FROM test where id='"+id+"'";
            ResultSet rs=stmt.executeQuery(sql);
            if(rs.next()){
                Blob blob = rs.getBlob("content");
                byte[] ab = blob.getBytes(1, (int)blob.length());
                response.setContentType("image/jpeg");
                ServletOutputStream op = response.getOutputStream();
                op.write(ab);
                op.flush();
                op.close();
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        System.out.println("======DownLoad end=====");
    }
}


呵呵
可能是我的表述不够清楚

我是想做一个JSP的下载系统
希望能通过点击一个链接(形如<a href="...."></a>)就直接弹出IE的下载窗口
不知道能否实现???


这个可以啊,但是这样就按照三楼的代码,形成一个文件,然后在<a href="">的href处指定该文件的地址就可以了!

那可否借用一个JSP页面来做跳板
点击链接后进入一个JSP页面
然后再调用JavaBean里的方法进行下载???


应该可以,但我没有写过!
呵呵

谢谢了~~~~~~
可是下载的方法我还是没找到
等问题解决了一起给分

另外
你提到的那个Socket方法
会不会受到防火墙的限制???


这个没试过,这要看防火墙有什么限制,会限制哪些连接了!


这个port是服务器端用于监听客户端连接的端口,在客户端要生成一个socket,eg
Socket s=new Socket(ipaddress,port);
客户端这样就发送了一个连接到ip地址或者服务器地址(域名)为ipaddress,端口为port的服务器的请求,服务器就在这个端口监听来自客户端的请求!如果请求成功就可以建立连接!传输数据!
所以这个端口一般是固定的不是随机的!

在服务器端通过out输出,那么它的输出在客户端来说就是输入,在客户端对应有一个socket.getInputStream()取得的inputStream!关于这些详细的io操作你可以看看文档!
对于流可以用outstream的write方法,writer就用println或者write方法写入!

posted on 2005-07-14 17:35  轻松逍遥子  阅读(673)  评论(0编辑  收藏  举报