BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。
但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。(以上摘自百度)
blob字段出库请点这里

1.首先说存入Blob,也就是上传文件并把文件存入数据库Blob字段
首先创建一个字符串存储上传的文件路径和名称:

String filePath = "";

上传文件的页面和普通上传文件写法一样,利用form表单提交servlet处理,注意设置form表单的enctype为multipart/form-data,然后提交到后台servlet中,然后重点来了,通过form表单提交的文件,要得到这个文件需要使用

DiskFileItemFactory factory = new DiskFileItemFactory();
这个东西 ,他的作用是:实例化一个硬盘文件工厂,用来配置文件组建ServletFileUpload,
然后创建一个文件上传解析器:
ServletFileUpload fileUpload = new ServletFileUpload(factory);
接下来解决乱码问题:
fileUpload.setHeaderEncoding("UTF-8");
之后判断拿到的数据是不是通过form提交上来的数据:

if(!fileUpload.isMultipartContent(request)){
   return;//如果进了if,那说明有问题,直接return,当然根据实际情况不同处理

然后创建一个临时路径,用来存放临时上传的文件,用于存入blob

String path = this.getServletContext().getRealPath("/WEB-INF/upload");
File file = new File(path);//放在WEB-INF文件夹下,是因为比较安全
//判断上传文件的保存目录是否存在
 if (!file.exists() && !file.isDirectory()) {
     System.out.println(savePath+"目录不存在,需要创建");
     //创建目录
     file.mkdir();

接下来就是获取提交的文件数据了,这里我们写List<FileItem>,因为如果一次提交多个文件,那么就需要接收多个文件:

List<FileItem> fiList = fileUpload.parseRequest(request);//使用ServletFileUpload解析器解析上传文件的数据,解析的结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入内容
for (int i = 0;i < fiList.size(); i++) {
   FileItem item =  fiList.get(i);//循环遍历list
   //在循环的时候,因为是从form表单中提交的,所以有可能会拿到form中提交的非文件数据,这种情况就要根据下面写法区分
   if(item.isFormField()){
      //如果程序进入到这里,那说明是非form提交的file数据
   }else{
     String fileName = item.getName();//拿到上传的文件名称
     //这里需要注意,不同浏览器提交的文件名不同,有的会连带着文件存放的路径一起拿到,所以需要处理拿到的fileName 
     fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);//这个就是拿到fileName的文件名部分
     String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + '_'+ new Random().nextInt(1000);//创建一个time的String,防止有可能文件名重复
     fileName += time;
     InputStream is = item.getInputStream();//创建文件输入流
     FileOutputStream fos = new FileOutputStream(path +File.separator+fileName);
     byte buffer[] = new byte[1024];//创建一个缓冲区
     int length = 0;//判断输入流中的数据是否已经读完的标识
     while((length = is.read(buffer))>0){//循环将输入流读入到缓冲区当中
        fos.write(buffer, 0, length);//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录中
     is.close();//关闭输入流
     fos.close();//关闭输出流   
     if(i != fiList.size() - 1){
       filePath = filePath + fileName+ "*";//记录每个上传的文件,用*分割,用*分割上传的每个文件是因为文件名中不能有*号
     }else{
       filePath = filePath + fileName;

到这里才是把要存入Blob的文件上传到临时路径下面,filePath就是我们上传的所有文件的路径并用*隔开的
存入数据库我们选择jdbc方式:

String[] files = filePath.split("*");
for(String fp : files){
  Class.forName("oracle.jdbc.driver.OracleDriver");
  // 根据数据库连接字符,名称,密码给conn赋值
  conn = DriverManager.getConnection("url", "user", "password");
  conn.setAutoCommit(false);//程序必须调用commit或者rollback方法
  // 初始化驱动包,这里我用的事oracle,jdbc是基础,都一样的
	String uuid = UUID.randomUUID().toString();//生成一个uuid
	String sql = "insert into test (id,blobvalue) values ('"+uuid+ "',empty_blob())"//先插入空的blob值empty_blob
	PreparedStatement pstmt = conn.prepareStatement(sql);
	pstmt.executeUpdate();
	pstmt.close();
	pstmt = conn.prepareStatement("select blobvalue from test where id= '"+ uuid + "' for update");
	ResultSet rset = pstmt.executeQuery();
	File f = new File(path + "\\" +fp);
	InputStream fin = new FileInputStream(f);
	if (rset.next()){
			BLOB oracleblob = (oracle.sql.BLOB) rset.getBlob(1);
		    OutputStream out = oracleblob.getBinaryOutputStream();
	        BufferedOutputStream output = new BufferedOutputStream(out); 
	        BufferedInputStream input = new BufferedInputStream(fin); 
	        byte[] buff = new byte[2048]; //用做文件写入的缓冲 
	        int bytesRead; 
	        while(-1 != (bytesRead = input.read(buff, 0, buff.length))){ 
	            output.write(buff, 0, bytesRead); 
	        fin.close();
	        out.flush();
	        output.close();
		}catch(Exception e){
			// 得到流
			OracleThinBlob oracleweblogicblob = (OracleThinBlob)rset.getBlob(1);
			OutputStream out = oracleweblogicblob.getBinaryOutputStream();
	        BufferedOutputStream output = new BufferedOutputStream(out); 
	        BufferedInputStream input = new BufferedInputStream(fin); 
	        byte[] buff = new byte[2048]; //用做文件写入的缓冲 
	        int bytesRead; 
	        while(-1 != (bytesRead = input.read(buff, 0, buff.length))){ 
	            output.write(buff, 0, bytesRead); 
	        fin.close();
	        out.flush();
	        output.close();
    pstmt.executeUpdate();//修改
	pstmt.close();
	conn.commit();提交
    conn.close();
    f.delete();//最后别忘了删除临时文件

到这里 基本就算完成了文件上传到数据库blob 我这里是吧文件上传和存入数据库分开写了,问了方便大家理解上传文件和存入blob字段,文章纯手打,可能有错误地方,不过具体思路和过程应该没啥问题,不过程序有很多需要优化的地方,比如数据库连接池创建写在了for循环里面,这样每次循环都创建、关闭都会很耗费电脑资源,本文章仅提供思路参考。
原创:影公子 ——转载请注明原帖链接

这里贴一个公司的技术公众号,欢迎关注:
在这里插入图片描述
在这里插入图片描述
【玩物得志技术】
走古风玩技术
每周四定期分享技术干货
程序员不无聊

在上一节讲述了如何根据JAVA实体类的大小,选择对应的blob格式,现在我们将以一个简单的例子完整的讲述如何将Java对象一Blob格式存储数据库。 修改TUser.java package cn.vicky.po; import cn.vicky.po.vo.User; import java.io.Serializable; import javax.persiste
如何读取及展示数据库BLOB类型的图片    【前言】最近在做某一需求时,需要从Oracle数据库读取图片。本以为数据库存储的会是一个简单的url,前台可以直接展示,结果却发现是BLOB二进制类型,于是乎,百度/Google了关键字“二进制图片读取及展示”,发现有很多“抄来抄去”的文章或博客,但是文章的质量都很低,而且结构比较混乱,看完之后仍然是“不明所以”。     最后,花了近2个小时,
20180828开发,提供了三种通过JDBC实现图片存储到BLOB的方式: 1、com.ztf:实现小页面,实现 指定保存的图片+打开指定编号图片 2、com.ub:实现简单的插入及读取操作,读取后的BLOB可以生成新图片,并使用JFrame方式展现。 3、com.cc: 由于需要将两个不同库(测试代码是同一个库的两个表 IMAGETAB和 IMAGETAB3)的的照片进行更新,表里面存照片的字段是blob类型的, 直接将结果select查询出来再update行不通,所以先将图片从库里导到本地,然后在从本地拿数据进行更新操作,根据ImgID进行update操作 ; jdbc参数放到db.properties里(有工具类) WEB方式未实现,后期自行研究(可通过JS将前台上传的图片处理成Base64编码格式的字符串, 然后将Base64字符串传参到Controller后进行解码处理后再存储到BLOB字段。 依赖Jar包: ojdbc6.jar
数据库相关视频讲解:用python编程Excel有没有用处?Java如何存储Blob类型数据数据库Java,我们经常会面对需要存储大型二进制数据(如图片、音频、视频等)到数据库的需求。这时候,我们就需要使用Blob类型来存储这些数据Blob类型是一种二进制数据类型,通常用于存储大型二进制对象。 Blob类型...
参考网址:http://www.cnblogs.com/jway1101/p/5815658.html 首先是建表语句,需要实现将表建立好。 CREATE TABLE `blobtest` ( `primary_id` varchar(32) NOT NULL, `bank_id` varchar(32) NOT NULL, `bank_name` varchar(64) NOT...
适合java程序员的算法: 老铁,@Bean实例化的顺序被你搞错了。 假设存在 A B 两个类,在A类中使用@Autowired注入B实例,注入的过程中,我们会调用doGetBeanNamesForType方法去寻找到B对对应的class对象。而寻找的过程中,在isTypeMatch方法内部,我们会优先实例化beanFactoty工厂。 假设C类使用了@Configuration注解,并且C类中含有多个@Bean方法,此时我们会把C类当成beanFactoty工厂。在我们实例化被@Bean标识的beanDefinition的时候,我们会判断它的父,也就是C是不是beanFactoty,如果是工厂,我们会优先实例化@Bean标识的方法。也就是说,@Bean标识的方法,在实例化的过程中第一次使用@Autowired注入的时候就会被实例化,而不会等到遍历beanDefinition,找到它的时候再实例化。它是会被优先实例化的 Kafka的相关知识 bug宁: 有一句话说:“失败是成功之母。”罗曼罗兰也曾说过:“要化悲痛为力量。”的确,当我们面对失败时,一定不能一蹶不振,要学会微笑面对失败。不要把失败当成什么了不起的大事而去狠它,因为狠你的敌人会影响判断力。我们应该把失败看得轻一点,只有这样,才能战胜它,胜败乃兵家常事嘛。 Tomcat的Connector启动过程分析 Jude_lo: 有一句话说:“失败是成功之母。”罗曼罗兰也曾说过:“要化悲痛为力量。”的确,当我们面对失败时,一定不能一蹶不振,要学会微笑面对失败。不要把失败当成什么了不起的大事而去狠它,因为狠你的敌人会影响判断力。我们应该把失败看得轻一点,只有这样,才能战胜它,胜败乃兵家常事嘛。