一般情况下,数据库只需要保存图片的路径就可以了,图片文件放在项目文件夹中,显示时只需加载图片路径即可。但是时下信息共享的渠道太多了 ,当IOS,android,微信公众号都操作同一个数据库的时候,上述方案是无法加载到图片的。因此我想到一个办法就是上传图片后,将路径替换为base64编码,存入数据库即可。
以前没有base64,很多时候是保存字节流,自从网页支持64位字符串显示图片后,很多系统改用保存64位,相对安全,图片不会直接显示到磁盘里,需要破解数据库才能获取数据,安全系统高点。(后话:这里还可以加密字符串数据保存)
在前端页面是怎么显示的呢
<img src="https://img-blog.csdnimg.cn/2022010615005713454.jpeg"/>
对就是这样简单,但是要提醒一下,不同文件需要的前置是不一样的
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
关于数据库设计,
因为一般后台是接收文件,然后转为64位,所以最好把文件的类型也保存起来,文件名也要(文件名可以随机生成也可以用回原来看业务需求)
id(char) | fileName(varchar) | suffixName(varchar) | textData(text或者blog) | fileSize(int) |
主键 | 文件名 | 文件后缀名 | 存放实际数据(64位) | 文件大小 |
然后提供文件转换的工具类代码如下:
package com.jy.base64;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.commons.codec.binary.Base64;
import org.springframework.web.multipart.MultipartFile;
public class BaseFileUtil {
/**
* File to byte[]
*
* @param file
* @return
*/
public static byte[] fileToBytes(File file) {
byte[] data = null;
InputStream inputStream = null;
if (file != null) {
try {
inputStream = new FileInputStream(file);
data = new byte[inputStream.available()];
inputStream.read(data);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseKit.inputStream(inputStream);
}
}
return data;
}
/**
* File to 64bit Str
*
* @param file
* @return
*/
public static String fileToBase64Str(File file) {
String data = null;
if (file != null) {
try {
byte[] datas = fileToBytes(file);
if (datas != null) {
data = Base64.encodeBase64String(datas);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return data;
}
/**
* MultipartFile to byte[]
*
* @param file
* @return
*/
public static byte[] multipartFileToBytes(MultipartFile multipartFile) {
byte[] data = null;
InputStream inputStream = null;
if (multipartFile != null) {
try {
inputStream = multipartFile.getInputStream();
data = new byte[inputStream.available()];
inputStream.read(data);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseKit.inputStream(inputStream);
}
}
return data;
}
/**
* MultipartFile to 64bit Str
*
* @param file
* @return
*/
public static String multipartFileToBase64Str(MultipartFile multipartFile) {
String data = null;
try {
byte[] datas = multipartFileToBytes(multipartFile);
if (datas != null) {
data = Base64.encodeBase64String(datas);
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* byte[] to file
*
* @param buf
* @param filePath
* @param fileName
*/
public static void byteToFile(byte[] buf, String filePath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
File dir = new File(filePath);
if (!dir.exists() && dir.isDirectory()) {
dir.mkdirs();
}
file = new File(filePath + File.separator + fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(buf);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseKit.outputStream(bos);
CloseKit.outputStream(fos);
}
}
/**
* 将base64字符解码保存文件
*
* @param base64Code
* @param targetPath 保存路径
*/
public static void base64DecoderToFile(String base64Str, String targetPath) {
FileOutputStream out = null;
try {
byte[] buffer = Base64.decodeBase64(base64Str);
out = new FileOutputStream(targetPath);
out.write(buffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseKit.outputStream(out);
}
}
/**
* 将base64字符保存文本文件
*
* @param base64Code
* @param targetPath 保存路径
*/
public static void base64ToTextFile(String base64Str, String targetPath) {
FileOutputStream out = null;
try {
byte[] buffer = base64Str.getBytes();
out = new FileOutputStream(targetPath);
out.write(buffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseKit.outputStream(out);
}
}
public static void main(String[] args) {
String filePath="D:/pic/0011111.jpg";
File file=new File(filePath);
String base64Str=fileToBase64Str(file);
base64DecoderToFile(base64Str,"D:/pic/023.jpg");
base64ToTextFile(base64Str,"D:/pic/023.txt");
}
}
具体效果如下: