服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - java实现插入mysql二进制文件,blob类型,遇到问题及解决办法

java实现插入mysql二进制文件,blob类型,遇到问题及解决办法

2019-10-27 16:20mysql教程网 Mysql

mysql插入二进制文件,blob类型,遇到问题及解决办法

首先是数据库建立要准备的: 
我们要把放置二进制字段设置为Blob类型,根据文件的大小选择合适的Blob类型,一下是各个Blob类型所能容纳二进制文件的大小 
MySQL的四种BLOB类型 
类型 大小(单位:字节) 
TinyBlob 最大 255 
Blob 最大 65K 
MediumBlob 最大 16M 
LongBlob 最大 4G 
一下是具体操作代码: 

复制代码代码如下:


/** 

* 把二进制文件(该二进制文件可以是本地硬盘路径,也可以是一个网络路径)存入数据库 
* create date:2009-5-13 author:Administrator 

* @param file 
* 可以是本地文件也可以是网络文件 
* @param conn 
*/ 
public void saveBinary(String file, Connection conn) { 
// 注意二进制文件写入数据库时所用到的类,以及类包装转换过程 
File f = null; 
if (file.toLowerCase().contains("http:")) 
f = DownLoadWithUrl.downLoadFile(file); 
else 
f = new File(file); 
if (f != null) { 
try { 
InputStream is = new FileInputStream(f); 
PreparedStatement ps = conn 
.prepareStatement("insert into bankVoice(name,text) values (?,?)"); 
ps.setString(1, file); 
int i = is.available(); 
ps.setBinaryStream(2, is, is.available()); 
ps.executeUpdate(); 
System.out.println("二进制文件插入成功"); 
ps.clearParameters(); 
ps.close(); 
is.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
System.out.println("二进制文件插入时出现异常"); 



注意在操作时候会出现以下异常,那么我们只需做一下设置:以我本地为例:进入D:\MySql5.0\mysql-5.0.51b-win32 目录,有以下文件可以看到:my-large.ini、my-small.ini、my-medium.ini、my-huge.ini 
我们把只需把mysql服务现在加载的ini文件中的配置项:max_allowed_packet 改为 16M 
即是:max_allowed_packet = 16M 默认的是1M我们改为16M,然后重启mysql服务器,这样就不会出现下面的异常了。 

复制代码代码如下:


com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1048587 > 1047552). You can change this value on the server by setting the max_allowed_packet' variable. 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2632) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2618) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1551) 
at com.mysql.jdbc.ServerPreparedStatement.storeStream(ServerPreparedStatement.java:2180) 
at com.mysql.jdbc.ServerPreparedStatement.serverLongData(ServerPreparedStatement.java:1199) 
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1004) 
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:670) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1159) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1076) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1061) 
at SaveBinaryToDB.SaveBinaryToDB.saveBinary(SaveBinaryToDB.java:33) 
at SaveBinaryToDB.SaveBinaryToDB.main(SaveBinaryToDB.java:17) 
/** 
* 从数据库中读取二进制文件 create date:2009-5-13 author:Administrator 

* @param file 
* @param conn 
*/ 
public void getBinary(String file, Connection conn) { 
// 注意二进制文件从数据库中读取时所用到的类,以及类的包装转换过程 
try { 
PreparedStatement ps = conn 
.prepareStatement("select text from bankVoice where name=?"); 
ps.setString(1, file); 
Blob blob = null; 
ResultSet rs = ps.executeQuery(); 
if (rs.next()) { 
blob = (Blob) rs.getBlob("text"); 

FileOutputStream fos = new FileOutputStream("D:\\test1.mp3"); 
fos.write(blob.getBytes(1, (int) blob.length())); 
System.out.println("二进制文件获得成功"); 
ps.clearParameters(); 
ps.close(); 
fos.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
System.out.println("二进制文件读取时出现异常"); 


package SaveBinaryToDB; 

复制代码代码如下:


/** 
* 本程序的功能实现网络下载 
* 把指定url的文件下载到本地硬盘 

*/ 
import java.io.*; 
import java.net.*; 
/** 
* @todo 将网上获取的图像,mp3等文件存储到本地 

* @version 1.0 
*/ 
public class DownLoadWithUrl { 
public static File downLoadFile(String fromUrl) { 
URL url; 
File file = null; 
try { 
// url = new 
// URL("http://count.koubei.com/showphone/showphone.php?f=jpg&w=96&h=10&bc=255,255,255&fc=0,0,0&fs=10&fn=arial&phone=NzMwNzIyNTE1%236aWCXtTNZYkxASrj"); 
url = new URL(fromUrl); 
URLConnection uc = url.openConnection(); 
InputStream is = uc.getInputStream(); 
// 根据下载文件类型的不同,进行相应的文件命名 
file = new File("D:\\forever.mp3"); 
FileOutputStream out = new FileOutputStream(file); 
/* 
* 该注释内的也是一种写入文件的方法,不过通常下载mp3或者比mp3更小图片 
* 等这些文件用这种带缓冲的方法写文件比较慢,所以说小文件下载通常用下面 的写文件方法就可以了 // byte[] b = new 
* byte[102400*3]; // int size = 0; // // while ((size = is.read(b)) != 
* -1) { // out.write(b, 1, size); // // } 
*/ 
int i = 0; 
while ((i = is.read()) != -1) { 
out.write(i); 

out.flush(); 
is.close(); 
} catch (Exception e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 

return file; 

/** 
* 删除本地磁盘指定路径的文件 create date:2009-5-13 author:Administrator 

* @param file 
*/ 
public static void delFile(String file) { 
File f = new File(file); 
if (f.exists()) 
f.delete(); 
System.out.println(file + "已经被删除"); 

public static void main(String[] args) { 
// delFile("D:\\forever.mp3"); 
downLoadFile(""); 

}

延伸 · 阅读

精彩推荐
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2972019-06-23
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6412020-03-13
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5442020-06-03
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23