- 浏览: 308041 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
z390174504:
恩,确实,我也遇到了,好像是库冲突了,我在一个库项目中,单独引 ...
VerifyError: Error #1053: Illegal override of… -
cl1154781231:
您好,为什么使用tk-filter不用过滤*.gzip???我 ...
ExtJS使用gzip压缩 -
YY008871:
仅限ie下登录成功或失败吗?
单点登录—基于cookie的简单实现(IE) -
蛋的懒蛋:
不好用啊,IE7是运行了,但是就是一启动就报错了,接着就关了 ...
IE7绿色版下载-转载 -
fireinwind:
harman001 写道 ,为什么我的id大写同样没事啊!- ...
Spring配置文件中id的第二个字母不能大写问题
前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件在数据库中要搞清楚下面几个内容:
1 mysql存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的
2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流
废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob
package com.lizhe;
import java.io.*;
import java.sql.*;
public class PutImg {
public void putimg() {
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
//stmt.execute("insert into imgt (id) values (5)");
stmt.close();
PreparedStatement pstmt = null;
String sql = "";
File file = new File("c:\\blog.jpg");
InputStream photoStream = new FileInputStream(file);
//sql = " UPDATE imgt SET img = ? ";
sql = "INSERT INTO imgtable (img) VALUES (?)";
pstmt = conn.prepareStatement(sql);
pstmt.setBinaryStream(1, photoStream, (int) file.length());
pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]){
PutImg pi=new PutImg();
pi.putimg();
}
}
InputStream photoStream = new FileInputStream(file);
可以很清楚的看到我们首先把一个图片文件(当然也可以是别的什么文件)转换成了一个二进制输入流
pstmt.setBinaryStream(1, photoStream, (int) file.length());
这个方法建议大家去查一下API文档,第一个参数是通配符位置没的说,第二个参数是流,这和以往的string类型的参数不太一样,我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字符串参数,这里我们还需要第三个参数来设置这个流的长度,这里也就是这个文件的长度,导出数据库中的sql,一切都清楚了
INSERT INTO `m_diy` VALUES (2,?\0 JFIF\0 \0H\0H\0\0?? Exif\0\0MM\0*\0\0\0 \0 \0 \0\0\0 \0 \0\0 \0 \0\0\0 \0\0\0b \0 \0\0\0 \0\0\0j (\0 \0\0\0 \0 \0\0 1\0 \0\0\0 \0\0\0r 2\0 \0\0\0 \0\0\0?i\0 \0\0\0 \0\0\0\0\0\0\0\0\0H\0\0\0 \0\0\0H\0\0\0 Adobe Photoshop CS Windows\02007:03:18 23:08:15\0\0\0\0\0 ?\0 \0\0\0 ??\0\0?\0 \0\0\0 \0\0\0? \0 ........等等
其实就是将文件先转换成了二进制的流,然后插入到了sql语言中,向数据库写入了很长很长的一段sql语句
然后我们再来写一个app程序将这个文件读出来,存储成一个图片文件
package com.lizhe;
import java.io.*;
import java.sql.*;
class GetImg {
private static final String URL = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;
public void blobRead(String outfile, int picID) throws Exception {
FileOutputStream fos = null;
InputStream is = null;
byte[] Buffer = new byte[4096];
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
pstmt = conn.prepareStatement("select img from imgt where id=?");
pstmt.setInt(1, picID); // 传入要取的图片的ID
rs = pstmt.executeQuery();
rs.next();
file = new File(outfile);
if (!file.exists()) {
file.createNewFile(); // 如果文件不存在,则创建
}
fos = new FileOutputStream(file);
is = rs.getBinaryStream("img");
int size = 0;
while ((size = is.read(Buffer)) != -1) {
// System.out.println(size);
fos.write(Buffer, 0, size);
}
} catch (Exception e) {
System.out.println( e.getMessage());
} finally {
// 关闭用到的资源
fos.close();
rs.close();
pstmt.close();
conn.close();
}
}
public static void main(String[] args) {
try {
GetImg gi=new GetImg();
gi.blobRead("c:/getimgs/1.jpg", 5);
} catch (Exception e) {
System.out.println("[Main func error: ]" + e.getMessage());
}
}
}
这里需要注意的是
is = rs.getBinaryStream("img");
img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的
最后在帖两个bs系统上用的文件给大家参考
通过struts的action向数据库写入二进制图片
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.lizhe.struts.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import com.lizhe.struts.form.UpimgForm;
/**
* MyEclipse Struts
* Creation date: 05-18-2007
*
* XDoclet definition:
* @struts.action path="/upimg" name="upimgForm" input="/userhomepage.jsp"
* @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"
*/
public class UpimgAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @throws IOException
* @throws FileNotFoundException
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {
UpimgForm upimgForm = (UpimgForm) form;// TODO Auto-generated method stub
FormFile file=upimgForm.getFile();
InputStream is=file.getInputStream();
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url = "jdbc:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterEncoding=gb2312";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
//stmt.execute("insert into img (id) values (5)");
stmt.close();
PreparedStatement pstmt = null;
String sql = "";
//File file = new File("c:\\blog.jpg");
//InputStream photoStream = new FileInputStream(file);
//sql = " UPDATE imgt SET img = ? ";
sql = "INSERT INTO img (img) VALUES (?)";
pstmt = conn.prepareStatement(sql);
pstmt.setBinaryStream(1, is, (int) file.getFileSize());
pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return mapping.findForward("userhomepage");
}
}
和app的方式几乎是一样的
第二个文件是通过jsp将数据库中的图片显示在页面上
这个有些不同
< %@ page contentType="text/html;charset=gb2312"%>
< %@ page import="java.sql.*" %>
< %@ page import="java.util.*"%>
< %@ page import="java.text.*"%>
< %@ page import="java.io.*"%>
< %@ page import="java.awt.*"%>
< html>
< body>
< %
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url="jdbc:mysql://localhost/img?user=root&password=root";
Connection con = DriverManager.getConnection(url);
String sql = "select * from imgt where id=5";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) {
InputStream in = rs.getBinaryStream("img");
ServletOutputStream op = response.getOutputStream();
int len;
byte[] buf=new byte[1024];
while((len= in.read(buf))!=-1) {
op.write(buf, 0, len);
}
op.close();
in.close();
}
rs.close();
stmt.close();
con.close();
%>
< /body>
< /html>
source:http://java.ccidnet.com/art/12017/20071221/1316731_1.html
发表评论
-
什么是java序列化,如何实现java序列化? .
2013-04-18 11:38 842Java 串行化技术可以使 ... -
javaMail邮件发送java.lang.SecurityException: Access to default session denied
2012-07-04 15:48 5331{exception=java.lang.SecurityEx ... -
java.lang.ClassCastException: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB
2012-05-12 18:46 1413开发时,向oracle写入blob数据时,如下: ... -
JDBC对CLOB的增修查
2011-09-23 16:06 1162package com.yysoft.a.test; imp ... -
Attribute value request.getAttribute("id") is quoted with " which must be
2009-11-25 12:55 2463<eoms:roomusr id="listU ... -
java中产生随机数
2009-06-23 16:06 1011import java.util.Random; /** * ... -
Collection和Map支持
2009-05-18 20:29 1143WebWork支持多种方法来判断集合中的对象类型. 这是通过一 ... -
eclipse 不自动编译java文件的问题
2009-04-08 14:15 1745今天出现了eclipse 不自动编译java文件的问题,在网上 ... -
properties文件编码问题
2009-04-03 11:04 1051在阅读JAVA程序的时候,遇到了一个问题:propertie ... -
Java编程技术中汉字问题的分析及解决
2009-04-03 11:02 947在基于 Java 语言的编程 ... -
EL表达式
2009-04-03 10:56 1456EL语法 EL的语法很简单 ... -
为什么Java不支持创建范型数组?
2008-12-22 11:44 1116http://www.blogjava.net/myqiao/ ... -
每一个JAVA初学者都应该搞懂的问题
2008-12-11 17:25 646对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果 ... -
把重要的业务日志异步批量写入数据库
2008-11-17 09:40 25531. 把重要的业务日志异 ... -
Checked vs UnChecked 异常 ,使用场合?
2008-10-24 17:04 3975异常的概念 ... -
文件夹路径 My Documents中包含无效字符的错误
2008-09-09 09:34 3975新装了套xp ghost版系统,d盘莫名其妙的指向了dvd光驱 ... -
FileWriter不能写utf-8
2008-08-01 01:48 6207今天碰到个问题,统计数据,用FileWriter写到unix系 ... -
java写文件方法之比较
2008-07-30 12:39 3293最近对以前开发的一个通用数据迁移的软件进行优化。除了用JDK5 ... -
JSP/Servlet的重定向技术综述
2008-07-28 08:57 1252由于response是jsp页面中的隐含对象,故在jsp页面中 ... -
webwork表单不提交
2008-07-23 09:12 1605现在的项目一直在用webwork,有时会碰到表单不提交的问题, ...
相关推荐
然后,从请求中获取用户的输入信息,并将文件数据转换为二进制流,最终通过PreparedStatement执行SQL插入操作,将图片数据存储到数据库的`ImageData`字段中。 #### 五、总结 通过以上步骤,我们可以实现一个完整的...
"利用Java程序实现Oracle数据库中大对象的存取" ...使用Java程序实现Oracle数据库中大对象的存取可以通过jdbc驱动程序连接Oracle数据库,并使用PreparedStatement对象执行SQL语句,实现对大对象的存储和读取。
1. BLOB类型:Oracle数据库提供了BLOB(Binary Large Object)数据类型,用于存储大块二进制数据,如图片。在创建表时,我们需要定义一个BLOB字段来保存图片内容。 2. CLOB与NCLOB:对于文本格式的图片(如Base64...
- BLOB(二进制大对象):用于存储大型二进制数据,如影像、图片等,其长度可达4GB,支持随机存取。 - BFILE:虽然用于存储大型二进制数据,但数据实际存储在文件系统中,数据库中仅存储指向文件的指针,Oracle对...
为了显示数据库中的图片,我们可以创建一个新的JSP页面,通过查询数据库获取图片的二进制数据,然后将其写入响应流。这里不再展示具体的代码,但基本思路是:先根据图片ID查询数据库,获取到图片的二进制数据,然后...
MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它提供了Java Database Connectivity (JDBC) API,使得Java开发者能够方便地在应用中存取MySQL数据库。标题"mysql-connector-java-3.1.11-bin"指出这...
6. **antlr-2.7.6rc1.jar**:ANTLR是一个强大的解析器生成器,可以用于读取、处理、执行或翻译结构化文本或二进制文件。在JSP中,可能用于解析和生成语法树。 7. **jboss-cache.jar**:这是JBoss的一个缓存解决方案...
2. **提供Java存取数据库能力的包是。** - **答案解析:** 正确答案为A。Java中用于访问数据库的主要包是`java.sql`,它提供了与数据库交互的基本接口和类,如`Connection`、`Statement`、`ResultSet`等。 3. **...
字节流与字符流的区别:字节流用于读写二进制数据,字符流用于读写文本数据。 final、finally、finalize三者区别:final用于声明常量,finally用在try-catch-finally语句中表示必须执行的代码块,finalize是Object...
实例中可能会展示如何创建WebSocket服务器端点以及客户端连接,以及如何通过WebSocket发送和接收文本或二进制数据。 3. **JSP与HTML/CSS/JavaScript** JSP(JavaServer Pages)是Java Web开发中的视图层技术,用于...
COM组件通过接口定义来实现功能的封装,支持二进制级别的互操作性。而CORBA(Common Object Request Broker Architecture)是一种跨平台的组件架构,由OMG(Object Management Group)制定,旨在解决分布式计算环境...
20. 二进制扩展:在无符号二进制整数后面添加0,相当于左移一位,值翻倍。 21. 十进制转二进制:58转换成二进制是111010,这是正确的。 22. 完全二叉树的叶子节点计算:对于含有n个节点的完全二叉树,如果n是奇数...
它通过网络进行通信,并使用二进制协议,提供高效的数据交换。 3. **Memcached客户端库**: 为了在Java应用中使用Memcached,我们需要一个Java客户端库。常见的有spymemcached、xmemcached等。这些库提供了与...
10. 位移运算:`a>>1`表示将变量`a`的二进制表示右移一位,对于整型变量6(二进制110),右移一位后得到3(二进制011)。 11. Access退出快捷键:Alt+F+X是退出Access的快捷键。 12. 选择多个图标:在Windows中,...
18. IP地址:IP地址由32位二进制数组成,而不是十进制。 19. Word段落标记:段落标记在打印时不被打印出来。 20. Visual FoxPro删除记录:SQL的DELETE命令可以直接删除记录,无需先用USE命令打开表,而传统的...
9. 数制转换:八进制转换为二进制,每位八进制数对应三位二进制数。 10. RAM:随机存取存储器(RAM),是计算机中的一种临时存储数据的硬件,对数据可存可取。 11. 数组初始化:在Java中,执行`int[] x = new int...
1. **像素值篡改**:通过修改图像的像素值来隐藏信息,比如使用LSB(Least Significant Bit)技术,将数据的二进制位替换图像像素的最低有效位。 2. **频域隐藏**:利用傅立叶变换,将秘密信息隐藏在图像的频率域中...
GET请求常用于获取信息,而POST请求可以传递更复杂的数据,包括二进制数据。在HTML表单中,可以通过method属性设置提交方法,默认为GET。 开发JavaWeb项目时,需要按照特定的目录结构组织源代码。创建Web项目后,...
14. JSP页面可以通过表单或超链接访问Servlet,这是Web应用的基本交互方式。 15. HTTP的GET请求可以获取各种类型的数据,包括HTML、图片、视频等。 16. SqlCommand对象的方法中没有ExecuteRead(),应该是...