如何直接下载保存在Oracl数据库中Blob字段的文件(不生成临时文件)???
2005-07-14 17:35
781 查看
急需
最好能不在服务器端生成临时文件直接下载
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方法写入!
最好能不在服务器端生成临时文件直接下载
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方法写入!
相关文章推荐
- 如何用JAVA将二进制文件转换成BASE64格式保存到MySQL的Blob字段里并读出下载
- 不经过临时文件,直接从BLOB字段,下载数据显示图片!
- 如何将服务器端文件 自动下载并保存到客户端IE临时文件夹 或者指定文件夹
- asp.net生成csv文件,并在客户端点击下载(文件流直接输出到客户端而不是先生成保存在服务端再下载)
- Kettle 生成的XML格式数据保存到Oracle 数据库的BLOB类型字段中
- struts2文件下载(文件保存以BLOB类型在数据库中)
- 采用struts2+hibernate实现保存文件到Oracle数据库&&并附下载代码【导入即可用】;数据库中保存blob类型的二进制文件
- ASP.NET文件下载简单实现(也可以通过直接读取数据库 大字段文件,如oracle 中的bolg,long raw 等大字段文件)
- 从数据库中读取blob字段并生成图片文件
- 查找数据库里的blob字段并保存在文件中
- 根据标题后缀名传参点击下载保存内容为任意格式文件(内容为oracle库中某字段值:BLOB类型)
- 如何不打开文件 直接出现下载保存提示框
- 如何在oracle的blob字段里保存多个文件
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- 如何在oracle的blob字段里保存多个文件
- ASP.NET 2.0 - 如何把上传的文件保存到数据库字段 (转自章立民CnBlogs)
- Kettle 生成的XML格式数据保存到Oracle 数据库的BLOB类型字段中
- 如何不打开文件 直接出现下载保存提示框
- 关于集成第三方office的sdk产品,采用servlet方式将数据库表BLOB字段文件下载与二进制文件上传到blob