首页 热点资讯 义务教育 高等教育 出国留学 考研考公

如何向MySQL中插入图片文件

发布网友 发布时间:2022-04-21 23:32

我来回答

4个回答

懂视网 时间:2022-04-07 19:07

推荐:《mysql视频教程》

正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在我在这里记下如何将图片存进mysql数据库

如果要图片存进数据库 要将图片转化成二进制。

1.数据库存储图片的字段类型要为blob二进制大对象类型

2.将图片流转化为二进制

下面放上代码实例

一、数据库

CREATE TABLE `photo` (
 `id` int(11) NOT NULL,
 `name` varchar(255) DEFAULT NULL,
 `photo` blob,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、数据库链接

/**
 * 
 */
package JdbcImgTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author Administrator
 * 
 */
public class DBUtil
{
 // 定义数据库连接参数
 public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
 
 public static final String URL = "jdbc:mysql://localhost:3306/test";
 
 public static final String USERNAME = "root";
 
 public static final String PASSWORD = "root";
 
 // 注册数据库驱动
 static
 {
 try
 {
  Class.forName(DRIVER_CLASS_NAME);
 }
 catch (ClassNotFoundException e)
 {
  System.out.println("注册失败!");
  e.printStackTrace();
 }
 }
 
 // 获取连接
 public static Connection getConn() throws SQLException
 {
 return DriverManager.getConnection(URL, USERNAME, PASSWORD);
 }
 
 // 关闭连接
 public static void closeConn(Connection conn)
 {
 if (null != conn)
 {
  try
  {
  conn.close();
  }
  catch (SQLException e)
  {
  System.out.println("关闭连接失败!");
  e.printStackTrace();
  }
 }
 }
 
 //测试
/* public static void main(String[] args) throws SQLException
 {
 System.out.println(DBUtil.getConn());
 }
 */
}

三、图片流

package JdbcImgTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author Administrator
 * 
 */
public class ImageUtil
{
 
 // 读取本地图片获取输入流
 public static FileInputStream readImage(String path) throws IOException
 {
 return new FileInputStream(new File(path));
 }
 
 // 读取表中图片获取输出流
 public static void readBin2Image(InputStream in, String targetPath)
 {
 File file = new File(targetPath);
 String path = targetPath.substring(0, targetPath.lastIndexOf("/"));
 if (!file.exists())
 {
  new File(path).mkdir();
 }
 FileOutputStream fos = null;
 try
 {
  fos = new FileOutputStream(file);
  int len = 0;
  byte[] buf = new byte[1024];
  while ((len = in.read(buf)) != -1)
  {
  fos.write(buf, 0, len);
  }
  fos.flush();
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 finally
 {
  if (null != fos)
  {
  try
  {
   fos.close();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
  }
 }
 }
}

四、转码存储

package JdbcImgTest;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author Administrator 测试写入数据库以及从数据库中读取
 */
public class ImageDemo
{
 
 // 将图片插入数据库
 public static void readImage2DB()
 {
 String path = "D:/Eclipse/eclipseWorkspace/TestProject/Img/mogen.jpg";
 Connection conn = null;
 PreparedStatement ps = null;
 FileInputStream in = null;
 try
 {
  in = ImageUtil.readImage(path);
  conn = DBUtil.getConn();
  String sql = "insert into photo (id,name,photo)values(?,?,?)";
  ps = conn.prepareStatement(sql);
  ps.setInt(1, 1);
  ps.setString(2, "Tom");
  ps.setBinaryStream(3, in, in.available());
  int count = ps.executeUpdate();
  if (count > 0)
  {
  System.out.println("插入成功!");
  }
  else
  {
  System.out.println("插入失败!");
  }
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 finally
 {
  DBUtil.closeConn(conn);
  if (null != ps)
  {
  try
  {
   ps.close();
  }
  catch (SQLException e)
  {
   e.printStackTrace();
  }
  }
 }
 
 }
 
 // 读取数据库中图片
 public static void readDB2Image()
 {
 String targetPath = "C:/Users/Jia/Desktop/mogen.jpg";
 Connection conn = null;
 PreparedStatement ps = null;
 ResultSet rs = null;
 try
 {
  conn = DBUtil.getConn();
  String sql = "select * from photo where id =?";
  ps = conn.prepareStatement(sql);
  ps.setInt(1, 1);
  rs = ps.executeQuery();
  while (rs.next())
  {
  InputStream in = rs.getBinaryStream("photo");
  ImageUtil.readBin2Image(in, targetPath);
  }
 }
 catch (Exception e)
 {
  e.printStackTrace();
 }
 finally
 {
  DBUtil.closeConn(conn);
  if (rs != null)
  {
  try
  {
   rs.close();
  }
  catch (SQLException e)
  {
   e.printStackTrace();
  }
  }
  if (ps != null)
  {
  try
  {
   ps.close();
  }
  catch (SQLException e)
  {
   e.printStackTrace();
  }
  }
  
 }
 }
 
 //测试
 public static void main(String[] args)
 {
 //readImage2DB();
 readDB2Image();
 }
}

热心网友 时间:2022-04-07 16:15

背景

MySQL 一直以来都有 TEXT、BLOB 等类型用来存储图片、视频等大对象信息。比如一张图片,随便一张都 5M 以上。视频也是,随便一部视频就是 2G 以上。

假设用 MySQL 来存放电影视频等信息,一部是 2G,那么存储 1000 部就是 2TB,2TB 也就是 1000 条记录而已,但是对数据库性能来说,不仅仅是看记录数量,更主要的还得看占用磁盘空间大小。空间大了,所有以前的经验啥的都失效了。

所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了。数据库只关心怎么来的快,怎么来的小。


举例

虽然不推荐 MySQL 这样做,但是也得知道 MySQL 该怎么做才行,做到心里有数。比如下面一张微信图片,大概 5M 的样子。

root@ytt:/var/lib/mysql-files# ls -sihl 微信图片_20190711095019.jpg274501 5.4M -rw-r--r-- 1 root root 5.4M Jul 11 07:17 微信图片_20190711095019.jpg

拷贝 100 份这样的图片来测试

热心网友 时间:2022-04-07 17:33

为什么一定要把图片存到数据库啊?你可以存储图片路径啊。我感觉存图片不大好,你要是用的时候还需要通过字节读出来。真的要存的话,首先需要建立图片存储字段的类型,设成字节类型的,比如BINARY,然后使用语句加载图片信息录入。
insert into table_name(image) values(load_file('a.jpg'));
这个方法我没试过,不过貌似可以。

热心网友 时间:2022-04-07 19:07

试试这个,

insert into table_name(image) values(load_file('a.jpg'));

这是别人告我的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com