用Java 将图片存入Mysql 并读出的方法

首先说明一点,此篇来自网络自我感觉这么做是很垃圾的,傻呀,把图片放到数据库中,一般只是存放地址。


我们要做的是将一张图片存入Mysql中,在Mysql中用Blob 来存储图片和音频等大的数据项.Blob 按其容量可分为四种,分别为:tinyblob,blob ,mediumblob, longblob.他们的大小分别为:256B,64KB,16MB,4GB.除了容量不同外,这四种的用法一个样.我们这次将用Blob. 首先

首先来创建我们的数据库,

create database Image;

use Image;

create table country (

id int primary key auto_increment,

name varchar(30),

flag blob,

description varchar(255)

);

数据库创建完毕,下面是Java 的程序代码,它实现的功能是从一个目录中读入一张图片(china.gif) ,然后在把它输出在另一个目录中(1.gif).

*****************************************************************************************************

import java.sql.*;
import java.io.*;

/**

author@tongxiao

time:2007.09.14

*/

public class TestImage {
private static final String URL = "jdbc:mysql://localhost/Image?user=root&password=root&useUnicode=true";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;
private InputStream inputImage = null;
private OutputStream outputImage = null;

public void blobInsert(String infile) {
   try {
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver loaded!");

    conn = DriverManager.getConnection(URL);
    System.out.println("Database connected!");

    pstmt = conn
      .prepareStatement("insert into Country (name,flag,description) values (?,?,?)");
    pstmt.setString(1, "china");

    file = new File(infile);
    try {
     inputImage = new FileInputStream(file);
    } catch (FileNotFoundException e) {

     e.printStackTrace();
    }
    pstmt.setBinaryStream(2, inputImage, (int) (file.length()));

    pstmt.setString(3, "A flag of China");
    pstmt.executeUpdate();
    System.out.println("commit successfully");
   } catch (ClassNotFoundException e) {

    e.printStackTrace();
   } catch (SQLException e) {
    e.printStackTrace();
   } finally {
    try {
     inputImage.close();
     pstmt.close();
     conn.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }

}

public void readBolb(String path, int id) {
   InputStream is = null;
   byte[] buffer = new byte[4096];

   try {
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver loaded!");

    conn = DriverManager.getConnection(URL);
    System.out.println("Database connected!");

    pstmt = conn
      .prepareStatement("select flag from Country where id =?");
    System.out.println("select ok");

    pstmt.setInt(1, id);
    rs = pstmt.executeQuery();

    rs.next();
    file = new File(path);
    if (!file.exists()) {
     try {
      file.createNewFile();
     } catch (IOException e) {

      e.printStackTrace();
     }

    }
    try {
     outputImage = new FileOutputStream(file);
     System.out.println(outputImage.toString());
    } catch (FileNotFoundException e) {

     e.printStackTrace();
    }

    Blob blob = rs.getBlob("flag");
    is = blob.getBinaryStream();
    try {
     System.out.println(is.available());
    } catch (IOException e2) {
    
     e2.printStackTrace();
    }
    try {
     System.out.println(is.available());
    } catch (IOException e1) {

     e1.printStackTrace();
    }

    int size = 0;
    try {
     while ((size = is.read(buffer)) != -1) {
      System.out.println(size);
      outputImage.write(buffer, 0, size);

     }
    } catch (IOException e) {

     e.printStackTrace();
    }

   } catch (ClassNotFoundException e) {

    e.printStackTrace();
   } catch (SQLException e) {

    e.printStackTrace();
   } finally {
    try {
     is.close();
     outputImage.close();
     pstmt.close();
     conn.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }

}

public static void main(String[] args) {

   new TestImage().blobInsert("c:\\TDdownload\\china.gif");
   new TestImage().readBolb("c:\\1.gif", 1);
}

}

程序执行完你将在相应的目录下看到一张输出的图片.同时在Mysql 客户端使用:select * from country;将显示一堆的乱麻,这就正常.说明图片已经存入Mysql 中.到次本次试验完毕!

要将头像图片保存到MySQL数据库,可以使用以下步骤: 1. 创建一个表来存储图片数据,例如: ``` CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), avatar MEDIUMBLOB ); ``` 2. 在Java中使用JDBC连接MySQL数据库。 3. 读取头像图片的二进制数据,例如: ``` FileInputStream fileInputStream = new FileInputStream(new File("avatar.jpg")); byte[] avatarData = new byte[fileInputStream.available()]; fileInputStream.read(avatarData); fileInputStream.close(); ``` 4. 将头像图片的二进制数据插入到数据库中,例如: ``` PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO user (username, avatar) VALUES (?, ?)"); preparedStatement.setString(1, "user1"); preparedStatement.setBytes(2, avatarData); preparedStatement.executeUpdate(); preparedStatement.close(); ``` 5. 当需要读取头像图片时,从数据库中查询二进制数据并将其转换为图片,例如: ``` Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT avatar FROM user WHERE username = 'user1'"); if (resultSet.next()) { byte[] avatarData = resultSet.getBytes("avatar"); FileOutputStream fileOutputStream = new FileOutputStream(new File("avatar.jpg")); fileOutputStream.write(avatarData); fileOutputStream.close(); } resultSet.close(); statement.close(); ``` 需要注意的是,将大量图片数据存储在数据库中可能会导致数据库性能下降,建议使用分布式文件系统或云存储服务来存储图片数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值