Mysql怎么把图片转换的base64,以字符串的类型存入数据库?

Mysql怎么把图片转换的base64,以字符串的类型存入数据库,用varchar感觉长度不够,应该怎么办?

为什么要存在数据库 你要知道,一个图片 100kb,你转成base64字符串 估计就是125kb以上了,这么大数据量,你要是存在数据库,你觉得合适吗?

楼上说的对 ,一般图片都传到云上,需要时再到云上去,如果图片量小的话可以存在服务器硬盘上,数据库只存一个路径就行

/**
     * 图片转Base64
     * 
     * @param imgFile 图片路径 包含后缀 比如xxx.jpg
     * @return
     * @throws Exception
     */
    public static String ImageToBase64(String imgFile) throws Exception {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理

        InputStream in = null;
        byte[] data = null;

        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);

            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        // String str = Base64.encodeBase64String(data);
        String str = encode(data);
        // System.out.println(java.net.URLEncoder.encode(str, "UTF-8"));
        return str;// 返回Base64编码过的字节数组字符串
    }

存字符串可以做到,使用MediumText类型或者,可以存16M
不建议这样做,因为一个图片转换为base64占用存储空间反而变大

你可以使用blob格式直接存储二进制格式数据,甚至你还可以通过gzip压缩一下以后再存入,减少空间占用

如果一个网页里嵌入了过多的外部资源,这些请求会导致整个页面的加载延迟,所以小图片经过压缩后进行base64加密放入数据库,再从数据库取出的图片数据以base64字符串格式嵌入到页面中,从而减少页面延迟

 

首先反对上来就说 MySQL 存图没意义的同学。有些场景、有些情况需把数据和图片、文件存在一起。综合看来更有效率、快捷,易于备份迁移等,都在一张表里嘛。比如上百万件产品列表,产品信息和产品照片存在一起,在你迁移备份时,非常灵活。所以说工具没有绝对的好坏,只有适不适合。

推荐一下这篇,讲了 BLOB 数据类型在实际应用中的意义和作用。这篇文章带着大家一起实现了一个学校学生花名册的应用。把学生的信息和学生证件照存在同一张表中,调取,迁移,备份都超级方便。这就是 BLOB 其中一个应用的意义。

接着我来说说如何把图片存成 base64 到 MySQL 的问题。

本地图片转base64编码

/**
     * @Description: 将图片转换成base64编码的字符串
     * @param @param imageSrc 文件路径
     * @param @return
     * @return String
     * @throws IOException
     */
    public static String imageToBase64(String imageSrc) throws IOException {
        //判断文件是否存在
        File file=new File(imageSrc);
        if(!file.exists()){
            throw new FileNotFoundException("文件不存在!");
        }
        StringBuilder pictureBuffer = new StringBuilder();
        FileInputStream input=new FileInputStream(file);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        //读取文件
        Base64 base64=new Base64();
        byte[] temp = new byte[1024];
        for(int len = input.read(temp); len != -1;len = input.read(temp)){
            out.write(temp, 0, len);
        }
        pictureBuffer.append(new String( base64.encodeBase64Chunked(out.toByteArray())));
        input.close();
        return pictureBuffer.toString();
    }

网络图片url转base64编码

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
import sun.misc.BASE64Encoder;
 
 
public class imgToBase64 {
 
    public static void main(String[] args) throws Exception {
        String url="https://pic.imgdb.cn/item/614201662ab3f51d91e492b3.jpg";
        String a = aa.getBase64ByUrl(url);
        System.out.println(a);
    }
 
    /**
     * 根据图片链接转为base64数据
     *
     * @param imageUrl
     * @return
     * @throws Exception
     */
    public static String getBase64ByUrl(String imageUrl) throws Exception {
        // new一个URL对象
        URL url = new URL(imageUrl);
        // 打开链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置请求方式为"GET"
        conn.setRequestMethod("GET");
        // 超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        // 通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        // 得到图片的二进制数据,以二进制封装得到数据,具有通用性
        byte[] data = readInputStream(inStream);
        BASE64Encoder encode = new BASE64Encoder();
        String s = encode.encode(data);
        return s;
    }
 
    private static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        // 创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        // 每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        // 使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            // 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        // 关闭输入流
        inStream.close();
        // 把outStream里的数据写入内存
        return outStream.toByteArray();
    }
 
}
 

希望对你有所帮助,有帮助的话,点个赞再走吧。