package shop.alien.util.md5;

import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 文件计算MD5
 *
 * @author ssk
 * @version 1.0
 * @date 2020/5/22 14:55
 */
@Slf4j
public class FileMd5Util {

    /**
     * 文件计算MD5
     *
     * @param file 文件
     * @return MD5
     */
    public static String fileToMd5(File file) {
        try {
            //FileInputStream是InputStream的子类，用于从文件中读取信息
            FileInputStream fis = new FileInputStream(file);
            //利用ByteArrayOutputStream将FileInputStream中的文件数据读出来
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = fis.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            //利用ByteArrayOutputStream的toByteArray()方法得到文件的字节数组。
            byte[] fileByte = bos.toByteArray();
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(fileByte);
            String md5Hex = new BigInteger(1, digest).toString(16);
            log.info("fileName={},MD5={}", file.getName(), md5Hex.toUpperCase());
            //释放资源
            bos.close();
            fis.close();
            return md5Hex.toUpperCase();
        } catch (IOException | NoSuchAlgorithmException e) {
            log.error("fileToMd5 ERROR Msg={},Stack={}", e.getMessage(), e.getStackTrace());
            return null;
        }
    }

    /**
     * 文件计算MD5
     *
     * @param uploadBytes 文件转byte数组
     * @return MD5
     */
    public static String fileToMd5(byte[] uploadBytes) {
        //校验MD5
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            log.error("fileToMd5 ERROR Msg={},Stack={}", e.getMessage(), e.getStackTrace());
        }
        byte[] digest = md5.digest(uploadBytes);
        return new BigInteger(1, digest).toString(16);
    }
}
