《摘抄1》
PostgreSQL 7.4 文档
Prev Fast Backward Chapter 31. JDBC 接口 Fast Forward Next
31.7. 存储二进制数据
PostgreSQL 提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 bytea存储在表中,或者使用大对象 特性,该特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在你的表中保存一个指向该表的类型为 oid 的数值来引用它。
为了判断那种方法比较合适,你必须理解每种方法的局限。 bytea 数据类型并不适合存储非常大数量的二进制数据。 虽然类型为 bytea 的字段可以存储最多 1G 字节的二进制数据, 但是这样它会要求数量巨大的内存来处理这样巨大的数值。存储二进制的大对象的方法更适合存储非常大的数值, 但也有自己的局限。特别是删除一个包含大对象引用的行并未删除大对象。 删除大对象是一个需要执行的独立的操作。大对象还有一些安全性的问题, 因为任何联接到数据库的人都可以查看或者更改大对象,即使他们没有查看/更新包含大对象引用的行的权限也一样。
版本 7.2 是第一个支持 bytea 类型的 JDBC 驱动版本。在 7.2 中引入的这个功能同时也引入了一个和以往的版本不同的行为。自 7.2 以来,方法 getBytes(), setBytes(), getBinaryStream() 和 setBinaryStream() 操作 bytea 类型。 在 7.1 和更早的版本里这些方法操作和 OID 类型关联的大对象。 我们可以通过在 Connection 上设置 compatible 属性为数值 7.1 来获取旧的 7.1 的行为。
要使用 bytea 数据类型你只需要使用 getBytes(),setBytes(), getBinaryStream(),或者 setBinaryStream() 方法。
要使用大对象的功能,你可以使用 PostgreSQL JDBC 驱动提供的 LargeObject 类,或者使用 getBLOB() 和 setBLOB() 方法。
Important: 你必须在 一次 SQL 事务内访问大对象。你可以通过 调用 setAutoCommit(false) 打开一个事务。
注意: 在将来的 JDBC 驱动中, getBLOB() 和 setBLOB() 方法可能不再操作大对象,而是将处理 bytea 数据类型。 因此如果你要用大对象,我们建议你使用 LargeObject API。
Example 31-8 包含一些有关如何用 PostgreSQL JDBC 驱动处理二进制数据的例子。
Example 31-8. 在 JDBC 里处理二进制数据例子
比如,假设你有一个表包含一幅图像和它的文件名, 并且你还想在 bytea 字段里存储图像∶
CREATE TABLE images (imgname text, img bytea);
要插入一幅图象,你可以:
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis, file.length());
ps.executeUpdate();
ps.close();
fis.close();
这里,setBinaryStream() 把来自一个流的 一些数目的字节转换成类型 bytea 的字段。 如果图像的内容已经放在 byte[] 里面了, 那么你也可以用 setBytes() 方法干这件事。
检索一幅图象甚至更容易(我在这里使用PreparedStatement,当然用Statement也是一样的):
PreparedStatement ps = con.prepareStatement("SELECT img FROM images WHERE imgname = ?");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
byte[] imgBytes = rs.getBytes(1);
// 从这开始使用数据
}
rs.close();
}
ps.close();
这里的二进制数据是以 byte[] 形式检索的。你也可以使用一个 InputStream。
另外你可能会需要存储一个非常大的文件,因此希望使用 LargeObject 类存储该文件∶
CREATE TABLE imageslo (imgname text, imgOID oid);
要插入一个图像,你可以用∶
// 所有大对象 API 调用都必须在一次事务中
conn.setAutoCommit(false);
// 获取大对象管理器以便进行操作
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();
//创建一个新的大对象
int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);
//打开一个大对象进行写
LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
// 现在打开文件
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
// 从文件拷贝数据到大对象
byte buf[] = new byte[2048];
int s, tl = 0;
while ((s = fis.read(buf, 0, 2048)) > 0){
obj.write(buf, 0, s);
tl += s;
}
// 关闭大对象
obj.close();
//现在向 imgeslo 插入行
PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslO VALUES (?,?)");
ps.setString(1, file.getName());
ps.setInt(2, oid);
ps.executeUpdate();
ps.close();
fis.close();
从大对象中检索图像∶
// 所有 LargeObject API 调用都必须在一个事务里
conn.setAutoCommit(false);
// 获取大对象管理器以便进行操作
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();
PreparedStatement ps = con.prepareStatement("SELECT imgoid FROM imageslO WHERE imgname = ?");
ps.setString(1, "myimage.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
//打开大对象读
int oid = rs.getInt(1);
LargeObject obj = lobj.open(oid, LargeObjectManager.READ);
//读取数据
byte buf[] = new byte[obj.size()];
obj.read(buf, 0, obj.size());
//在这里对读取的数据做些处理
// 关闭对象
obj.close();
}
rs.close();
}
ps.close();
Prev Home Next
创建和更改数据库对象 Up PostgreSQL 对 JDBC API的扩展
《摘抄2》
postgreSQL中怎样建个带图片字段的表啊?
postgreSQL中怎样建个带图片字段的表啊?
是不是这样啊:
create table test(
id int4 not null,
name varchar(10) not null,
tupian BLOB,
primary key(id)
);
如不是那应该是怎么建啊?
zug 发表于 2004-02-25 08:45
postgreSQL中怎样建个带图片字段的表啊?
引用
原帖由 "marszxy" 发表:
postgreSQL中怎样建个带图片字段的表啊?
是不是这样啊:
create table test(
id int4 not null,
name varchar(10) not null,
tupian BLOB,
primary key(id)
);
如不是那应该是怎么建啊?
BLOB在PG中没有。可以用三种方式存图片
1.使用大对象
create table test(
id int4 not null,
name varchar(10) not null,
tupian oid,
primary key(id)
);
2.使用Text字段将二进制图片用BASE64编码存为字符串
create table test(
id int4 not null,
name varchar(10) not null,
tupian text,
primary key(id)
);
3.用二进制数组bytea
create table test(
id int4 not null,
name varchar(10) not null,
tupian bytea,
primary key(id)
);
以上三种方式(第一种属过时的方法,且操作稍复杂)都可以存图片
或其它任何格式的数据长度好象是2G的限制。
netkiller 发表于 2004-02-25 15:36
postgreSQL中怎样建个带图片字段的表啊?
TEXT BASE64 那个,不太好.
BASE64后.文件会增大很多..
还有编码/解码.这个过程也浪费资源..
你看看这个..
http://www.pgsqldb.org/pgsqldoc-cvs/jdbc-binary-data.html
分享到:
相关推荐
在Java编程中,将图片上传并存储到数据库是一项常见的任务,尤其在开发Web应用时。这一过程涉及到文件处理、数据库操作以及可能的图像处理。以下是对这个主题的详细阐述: 首先,我们需要理解基本的文件上传流程。...
这个知识点讲解了如何将图片压缩后保存在数据库中,并详细解释了图片压缩、图片存储在数据库、使用 Java 保存图片到数据库、数据库表字段、Java 图片处理、数据库字段存储图片和小图片存储在数据库的过程。
在这个项目中,我们主要关注的是如何在SSM框架下实现图片上传并将其信息存储到数据库,以及如何将已存储的图片信息回显出来。 首先,`Spring`作为核心容器,负责管理应用中的所有Bean,提供依赖注入(Dependency ...
// 保存图片到临时目录,然后转换为字节数组 byte[] imageData = fileItem.get(); // ... } catch (FileUploadException e) { // 处理异常 } } } ``` 从`FileItem`获取到的`imageData`可以用于存储到...
// 保存图片URL到数据库的逻辑 } else { redirectAttributes.addFlashAttribute("message", "请选择要上传的文件"); } } catch (IOException e) { e.printStackTrace(); } ``` 文件保存后,我们可以获取其在...
使用上传功能获取路径(我这边的是直接指定的,一般是从页面层获取的),然后传到dao层 然后通过dao层将二进制流写到数据库中(附上数据库); 点击下载功能,从数据库中获取二进制流,然后将二进制流转换为...
在本文中,我们将深入探讨如何使用Java实现在本地读取图片并将其存储到数据库中,之后再通过HTML页面显示这些图片。这个过程涉及到的主要技术包括Java编程、数据库操作(特别是MySQL)以及前后端交互。 首先,我们...
在Spring MVC框架中,处理本地图片的上传、存储到数据库以及实时显示是一个常见的需求。这个过程涉及多个步骤,包括前端表单设计、后端控制器处理、文件上传逻辑、数据库操作以及视图展示。下面我们将详细讲解这个...
4. **将图片保存到数据库**:对于图片的存储,常见的做法是将其转换为二进制数据,然后存储到数据库的BLOB(Binary Large Object)字段。Java提供了`java.sql.Connection`、`PreparedStatement`等接口来执行SQL语句...
在这个场景中,“ssh保存图片到数据库”指的是使用SSH框架将图片数据存储到数据库中,以便于在应用中进行管理和展示。通常,这涉及到几个关键步骤: 1. **读取图片**:首先,你需要一个用户接口来上传图片,可能是...
**MyBatis**:MyBatis是一个持久层框架,允许开发者用SQL语句直接操作数据库,通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。...
8. **应用场景**:这种技术常见于Web应用中,特别是当服务器需要存储用户上传的图片并且希望在不需要额外服务器存储空间的情况下提供图片服务时。此外,对于移动应用,BASE64编码也常用于在网络请求中传递小尺寸图片...
上传图片到数据库并使用JDBC操作BLOB 在本篇文章中,我们将讨论如何上传图片到数据库,并使用JDBC操作BLOB(Binary Large OBject)。BLOB是一种二进制大对象,是数据库中的一种数据类型,用于存储大规模的二进制...
在IT行业中,将图片上传至服务器并保存到数据库是一项常见的操作,这涉及到多个技术环节,包括前端文件上传、后端处理、数据库存储以及文件的在线预览和下载功能。以下是对这一过程的详细阐述: 首先,前端部分通常...
在本场景中,我们关注的是如何通过Servlet接收上传的文件流并将其保存到数据库中。这个过程涉及到多个步骤,包括接收文件流、处理文件流、以及与数据库交互。 首先,当用户通过网页上传文件时,浏览器会发送一个...
上传图片到数据库的过程通常包括以下几个步骤: 1. **前端处理**:用户在应用程序中选择或拍摄图片后,前端代码(如JavaScript)会读取图片文件并转换为适合网络传输的格式,如Base64编码或Blob对象。 2. **数据...
总之,通过JSP和相关的Java库,我们可以实现一个用户友好的图片上传功能,将图片保存在服务器并将其数据存储到数据库中。这样的功能在很多Web应用中都很常见,如在线相册、社交网络等。理解并掌握这一过程对于任何...
二是将图片存储在文件系统中,只在数据库中保存图片的路径。这里我们主要讨论第一种情况,即直接存储图片二进制数据。 1. **图片读取与转换**: 在Java中,我们可以使用`java.awt.image.BufferedImage`类来读取和...
"Post提交,图片以文件流形式上传并保存到数据库"这一技术主题涉及到的是HTTP的POST请求方式、文件流处理以及数据库存储。以下是对这个主题的详细解释: 1. **POST请求**: POST请求是HTTP协议中的一个方法,用于...
综上所述,Jeesite实现图片上传到数据库并解析展示,涉及到的技术点包括前端交互、后端处理、数据库操作、图片流处理等。通过这一系列步骤,可以构建出一个高效、安全的图片管理系统。在实际开发中,开发者需要根据...