package com.dxhy.common.utils;

/**
 * @ClassName Base64FileUtil
 * @Description TODO
 * @Author wangruwei
 * @Date 2024/9/27 13:38
 * @Version 1.0
 */

import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;

public class Base64FileUtil {

    /**
     * 将Base64字符串转换为对应的文件
     * @param base64Str Base64编码后的文件字符串
     * @param outputFilePath 输出文件路径
     * @throws IOException 如果文件操作失败时抛出异常
     */
    public static void base64ToFile(String base64Str, String outputFilePath) throws IOException {
        // 1. 解码Base64字符串为字节数组
        byte[] fileBytes = Base64.getDecoder().decode(base64Str);

        // 2. 创建输出文件对象
        File outputFile = new File(outputFilePath);

        // 3. 确保父目录存在
        File parentDir = outputFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();  // 创建父目录
        }

        // 4. 将字节数组写入文件
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            fos.write(fileBytes);
        }

        System.out.println("文件已成功写入: " + outputFilePath);
    }

    /**
     * 将文件转换为Base64编码的字符串
     * @param filePath 文件的路径
     * @return Base64编码后的字符串
     * @throws IOException 如果文件读取失败时抛出异常
     */
    public static String fileToBase64(String filePath) throws IOException {
        // 1. 创建文件对象
        File file = new File(filePath);

        // 2. 创建文件输入流读取文件内容
        try (FileInputStream fis = new FileInputStream(file)) {
            // 3. 获取文件长度
            byte[] fileBytes = new byte[(int) file.length()];

            // 4. 读取文件内容到字节数组中
            fis.read(fileBytes);

            // 5. 使用Base64进行编码
            return Base64.getEncoder().encodeToString(fileBytes);
        }
    }

    /**
     * 将文件转换为Base64编码的字符串
     * @param file 文件
     * @return Base64编码后的字符串
     * @throws IOException 如果文件读取失败时抛出异常
     */
    public static String fileToBase64(File file) throws IOException {

        // 2. 创建文件输入流读取文件内容
        try (FileInputStream fis = new FileInputStream(file)) {
            // 3. 获取文件长度
            byte[] fileBytes = new byte[(int) file.length()];

            // 4. 读取文件内容到字节数组中
            fis.read(fileBytes);

            // 5. 使用Base64进行编码
            return Base64.getEncoder().encodeToString(fileBytes);
        }
    }

    public static void main(String[] args) {
        String base64Str = FileUtil.readUtf8String("E:\\a\\b\\aaaa.txt");
        //"[encoded data, 155724 characters]";  // 替换为实际的Base64字符串
        String outputFilePath = "E:\\a\\b\\ba.pdf";  // 设置输出文件的路径和名称

        try {
            base64ToFile(base64Str, outputFilePath);
        } catch (IOException e) {
            System.err.println("文件写入失败: " + e.getMessage());
        }
    }
}
