【Java】將文件轉爲64位字符串保存到數據庫(代碼直接工具類)

 

       一般情況下,數據庫只需要保存圖片的路徑就可以了,圖片文件放在項目文件夾中,顯示時只需加載圖片路徑即可。但是時下信息共享的渠道太多了 ,當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");
	}
	
	
	
	
}

具體效果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章