当前位置: 首页 > 图文教程 > 数据库 > MYSQL > java实现插入mysql二进制文件,blob类型,遇到问题及解决办法

MYSQL
MySQL忘记密码恢复密码的实现方法
mysql 时间转换函数的使用方法
使用mysql的disctinct group by查询不重复记录
mysql备份恢复mysqldump.exe几个常用用例
超详细mysql left join,right join,inner join用法分析
mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载
比较详细的MySQL字段类型说明
mysql 记录不存在时插入 记录存在则更新的实现方法
MYSQL基础之连接MYSQL、修改密码、添加用户
mysql数据库优化必会的几个参数中文解释
mysql中文排序注意事项与实现方法
MySQL 5.0触发器参考教程
MySQL5创建存储过程的示例
MYSQL5 masterslave数据同步配置方法
mysql数据库导出xml的实现方法
MySql增加用户、授权、修改密码等语句
Mysql默认设置的危险性分析
用MySQL创建数据库和数据库表代码
Mysql如何避免全表扫描的方法
mysql的校对规则引起的问题分析

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 170 ::
收藏到网摘: n/a

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#6aWCXtTNZYkxASrj ");
                        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("");
        }
}