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();
}
}
希望对你有所帮助,有帮助的话,点个赞再走吧。