知识改变人生

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

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

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

  1. /** 
  2. * 
  3. * 把二进制文件(该二进制文件可以是本地硬盘路径,也可以是一个网络路径)存入数据库 
  4. * create date:2009-5-13 author:Administrator 
  5. * 
  6. * @param file 
  7. * 可以是本地文件也可以是网络文件 
  8. * @param conn 
  9. */
  10. public void saveBinary(String file, Connection conn) {
  11. // 注意二进制文件写入数据库时所用到的类,以及类包装转换过程 
  12. File f = null;
  13. if (file.toLowerCase().contains(“http:”))
  14. f = DownLoadWithUrl.downLoadFile(file);
  15. else
  16. f = new File(file);
  17. if (f != null) {
  18. try {
  19. InputStream is = new FileInputStream(f);
  20. PreparedStatement ps = conn
  21. .prepareStatement(“insert into bankVoice(name,text) values (?,?)”);
  22. ps.setString(1, file);
  23. int i = is.available();
  24. ps.setBinaryStream(2, is, is.available());
  25. ps.executeUpdate();
  26. System.out.println(“二进制文件插入成功”);
  27. ps.clearParameters();
  28. ps.close();
  29. is.close();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. System.out.println(“二进制文件插入时出现异常”);
  33. }
  34. }
  35. }

注意在操作时候会出现以下异常,那么我们只需做一下设置:以我本地为例:进入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服务器,这样就不会出现下面的异常了。

  1. 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.
  2. at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2632)
  3. at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2618)
  4. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1551)
  5. at com.mysql.jdbc.ServerPreparedStatement.storeStream(ServerPreparedStatement.java:2180)
  6. at com.mysql.jdbc.ServerPreparedStatement.serverLongData(ServerPreparedStatement.java:1199)
  7. at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1004)
  8. at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:670)
  9. at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1159)
  10. at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1076)
  11. at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1061)
  12. at SaveBinaryToDB.SaveBinaryToDB.saveBinary(SaveBinaryToDB.java:33)
  13. at SaveBinaryToDB.SaveBinaryToDB.main(SaveBinaryToDB.java:17)
  14. /** 
  15. * 从数据库中读取二进制文件 create date:2009-5-13 author:Administrator 
  16. * 
  17. * @param file 
  18. * @param conn 
  19. */
  20. public void getBinary(String file, Connection conn) {
  21. // 注意二进制文件从数据库中读取时所用到的类,以及类的包装转换过程 
  22. try {
  23. PreparedStatement ps = conn
  24. .prepareStatement(“select text from bankVoice where name=?”);
  25. ps.setString(1, file);
  26. Blob blob = null;
  27. ResultSet rs = ps.executeQuery();
  28. if (rs.next()) {
  29. blob = (Blob) rs.getBlob(“text”);
  30. }
  31. FileOutputStream fos = new FileOutputStream(“D:\\test1.mp3”);
  32. fos.write(blob.getBytes(1, (int) blob.length()));
  33. System.out.println(“二进制文件获得成功”);
  34. ps.clearParameters();
  35. ps.close();
  36. fos.close();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. System.out.println(“二进制文件读取时出现异常”);
  40. }
  41. }

package SaveBinaryToDB;

  1. /** 
  2. * 本程序的功能实现网络下载 
  3. * 把指定url的文件下载到本地硬盘 
  4. * 
  5. */
  6. import java.io.*;
  7. import java.net.*;
  8. /** 
  9. * @todo 将网上获取的图像,mp3等文件存储到本地 
  10. * 
  11. * @version 1.0 
  12. */
  13. public class DownLoadWithUrl {
  14. public static File downLoadFile(String fromUrl) {
  15. URL url;
  16. File file = null;
  17. try {
  18. // url = new 
  19. // 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”); 
  20. url = new URL(fromUrl);
  21. URLConnection uc = url.openConnection();
  22. InputStream is = uc.getInputStream();
  23. // 根据下载文件类型的不同,进行相应的文件命名 
  24. file = new File(“D:\\forever.mp3”);
  25. FileOutputStream out = new FileOutputStream(file);
  26. /* 
  27. * 该注释内的也是一种写入文件的方法,不过通常下载mp3或者比mp3更小图片 
  28. * 等这些文件用这种带缓冲的方法写文件比较慢,所以说小文件下载通常用下面 的写文件方法就可以了 // byte[] b = new 
  29. * byte[102400*3]; // int size = 0; // // while ((size = is.read(b)) != 
  30. * -1) { // out.write(b, 1, size); // // } 
  31. */
  32. int i = 0;
  33. while ((i = is.read()) != –1) {
  34. out.write(i);
  35. }
  36. out.flush();
  37. is.close();
  38. } catch (Exception e) {
  39. // TODO Auto-generated catch block 
  40. e.printStackTrace();
  41. }
  42. return file;
  43. }
  44. /** 
  45. * 删除本地磁盘指定路径的文件 create date:2009-5-13 author:Administrator 
  46. * 
  47. * @param file 
  48. */
  49. public static void delFile(String file) {
  50. File f = new File(file);
  51. if (f.exists())
  52. f.delete();
  53. System.out.println(file + “已经被删除”);
  54. }
  55. public static void main(String[] args) {
  56. // delFile(“D:\\forever.mp3”); 
  57. downLoadFile(“”);
  58. }
  59. }
赞(0)
未经允许不得转载:很文技术博客 » mysql插入二进制文件,blob类型,遇到问题及解决办法

评论 抢沙发