欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-10 23:16:34
首先是数据库建立要准备的: 我们要把放置二进制字段设置为blob类型,根据文件的大小选择合适的blob类型,一下是各个blob类型所能容纳二进制文件的大小 mysql的四种...
首先是数据库建立要准备的:
我们要把放置二进制字段设置为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("");
}
}