【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");
	}
	
	
	
	
}

具体效果如下:

 

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