一般情況下,數據庫只需要保存圖片的路徑就可以了,圖片文件放在項目文件夾中,顯示時只需加載圖片路徑即可。但是時下信息共享的渠道太多了 ,當IOS,android,微信公衆號都操作同一個數據庫的時候,上述方案是無法加載到圖片的。因此我想到一個辦法就是上傳圖片後,將路徑替換爲base64編碼,存入數據庫即可。
以前沒有base64,很多時候是保存字節流,自從網頁支持64位字符串顯示圖片後,很多系統改用保存64位,相對安全,圖片不會直接顯示到磁盤裏,需要破解數據庫才能獲取數據,安全系統高點。(後話:這裏還可以加密字符串數據保存)
在前端頁面是怎麼顯示的呢
<img src="data:image/jpeg;base64,<base64編碼的jpeg圖片數據這裏請替換爲待會提供的工具生成的64位字符串>"/>
對就是這樣簡單,但是要提醒一下,不同文件需要的前置是不一樣的
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");
}
}
具體效果如下: