将file转变成contenthash
一、将MultipartFile转file
CommonsMultipartFile cf= (CommonsMultipartFile)file; DiskFileItem fi = (DiskFileItem)cf.getFileItem(); File fil = fi.getStoreLocation();
二、将file转换成contenthash
String contenthashSource = Utils.encryptSHA(Utils.file2byte(fil)); String firstFileSource = contenthashSource.substring(0, 2); //获取前两位作为存储一级文件夹 String secondFileSource = contenthashSource.substring(2, 4); //获取这两位作为存储二级文件夹 contenthash作为文件名
三、utils实体类
package cn.edu.hbcf.tools; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.util.HashMap; import java.util.Map; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; public class Utils { /** * 定义加密方式 */ private final static String KEY_SHA1 = "SHA-1"; /** * 全局数组 */ private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; /** * SHA 加密 * @param data 需要加密的字节数组 * @return 加密之后的字节数组 * @throws Exception */ public static String encryptSHA(byte[] data) throws Exception { // 创建具有指定算法名称的信息摘要 // MessageDigest sha = MessageDigest.getInstance(KEY_SHA); MessageDigest sha = MessageDigest.getInstance(KEY_SHA1); // 使用指定的字节数组对摘要进行最后更新 sha.update(data); // 完成摘要计算并返回 return byteArrayToHexString(sha.digest()); } /** * 转换字节数组为十六进制字符串 * @param bytes 字节数组 * @return 十六进制字符串 */ private static String byteArrayToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { sb.append(byteToHexString(bytes[i])); } return sb.toString(); } /** * 将一个字节转化成十六进制形式的字符串 * @param b 字节数组 * @return 字符串 */ private static String byteToHexString(byte b) { int ret = b; //System.out.println("ret = " + ret); if (ret < 0) { ret += 256; } int m = ret / 16; int n = ret % 16; return hexDigits[m] + hexDigits[n]; } public static byte[] file2byte(File file) { byte[] buffer = null; try { FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; } /** * * @方法描述: 将office文件装换成pdf存储 * @param * @return void * @author 全冉 * @date 2016-2-3 */ public static void convert(File input, File output, DocumentFormat outputFormat){ OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); try { connection.connect(); DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(input, output, outputFormat); } catch(Exception e) { e.printStackTrace(); } finally { try{ if(connection != null){connection.disconnect(); connection = null;}}catch(Exception e){} } } /** * * @方法描述: 将文件复制到一个指定位置 * @param * @return void * @author 全冉 * @date 2016-2-3 */ public static void copy(File fil,File f){ FileChannel in = null; FileChannel out = null; FileInputStream inStream = null; FileOutputStream outStream = null; try { inStream = new FileInputStream(fil); outStream = new FileOutputStream(f); in = inStream.getChannel(); out = outStream.getChannel(); in.transferTo(0, in.size(), out); } catch (IOException e) { e.printStackTrace(); } finally { try { inStream.close(); in.close(); outStream.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }