java中Blob数据存入数据库
来源:互联网 发布:游戏编程刚开始学 编辑:程序博客网 时间:2024/05/18 06:49
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()){ try{ 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技术学习交流群467047721
点击链接加入群【Java技术学习交流群】:https://jq.qq.com/?_wv=1027&k=48DlKMY
- java中Blob数据存入数据库
- delphi中更新表字段update BLOB型数据(image)/获取图片转成BLOB型存入数据库
- 2_向数据库中存入图片BLOB(单机)
- byteArray转BLOB存入数据库
- java向Oracle数据库中插入blob字段数据
- (一)JAVA将XML以String格式存入字段属性为Blob的DB2数据库中
- DataGridView中数据存入数据库方法
- java导入excel数据内容存入数据库
- orcale中跨数据库写入BLOB数据
- 数据库中使用Blob处理二进制数据
- java 将图片存入mysql数据库中
- java 数据存入mysql表中乱码
- Java将zip存入oralce的blob
- java中如何导入03和07版的Excel文件数据,存入到数据库
- oracle 中 blob类型数据修改(从file保存到数据库,从java.sql.Blob 保存到oracle.sql.BLOB )
- java读取oracle数据库中blob字段
- 用hibernate跨数据平台将数据存入数据库中
- 从Form中textBox中读取数据存入数据库
- 1.Android系统的四大组件
- 正则表达式其实并不难(上)
- 初学Android中用id来进行xml中的控件获取
- ubuntu 下部署 javaWeb 项目配置 jdk环境变量和安装tomcat7
- 通过mark和reset方法重复利用InputStream
- java中Blob数据存入数据库
- java引用类型---阅读笔记
- 补上
- 初学Java004 常见错误
- 创建一个新闻客户端
- Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)
- 在Ubuntu, Debian, 或Mint系统中编译FFmpeg
- c++编程格式
- 金蝶EAS,分录监听,新增分录行时设置默认值