[分享]java实现插入mysql二进制文件,blob类型,遇到问题及解决办法_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2269 | 回复: 0   主题: [分享]java实现插入mysql二进制文件,blob类型,遇到问题及解决办法        下一篇 
koei666
注册用户
等级:新兵
经验:61
发帖:63
精华:0
注册:2012-1-9
状态:离线
发送短消息息给koei666 加好友    发送短消息息给koei666 发消息
发表于: IP:您无权察看 2014-11-11 14:51:33 | [全部帖] [楼主帖] 楼主

首先是数据库建立要准备的:

我们要把放置二进制字段设置为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("");
      }
}


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论