package com.ema.common.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import lombok.SneakyThrows;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.io.InputStream;

/**
 * 自定义的Http文件下载等工具类
 */
public class MyHttpUtil {

    /**
     * 文件下载输出
     *
     * @param fileName    下载的文件名（中文不要太多，最多支持17个中文，因为header有150个字节限制）
     * @param inputStream
     * @param response
     */
    @SneakyThrows
    public static void download(@NotBlank String fileName, InputStream inputStream,
                                HttpServletResponse response) {
        // 创建输出流对象
        ServletOutputStream outputStream = response.getOutputStream();
        // 设置返回内容格式
        response.setContentType("application/octet-stream");
        // 把文件名按UTF-8取出并按ISO8859-1编码，保证弹出窗口中的文件名中文不乱码
        // 中文不要太多，最多支持17个中文，因为header有150个字节限制。
        // 这一步一定要在读取文件之后进行，否则文件名会乱码，找不到文件
        fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
        // 设置下载弹窗的文件名和格式（文件名要包括名字和文件格式）
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 返回数据到输出流对象中
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        // 关闭流
        inputStream.close();
        outputStream.flush();
    }

    /**
     * 文件下载输出
     *
     * @param fileName 下载的文件名（中文不要太多，最多支持17个中文，因为header有150个字节限制）
     * @param path     文件路径："/mydata/zijinchakong/一键分析报告.doc"
     * @param response
     */
    @SneakyThrows
    public static void download(@NotBlank String fileName, @NotBlank String path,
                                HttpServletResponse response) {
        // 创建输出流对象
        ServletOutputStream outputStream = response.getOutputStream();
        //以字节数组的形式读取文件
        byte[] bytes = FileUtil.readBytes(path);
        // 设置返回内容格式
        response.setContentType("application/octet-stream");
        // 把文件名按UTF-8取出并按ISO8859-1编码，保证弹出窗口中的文件名中文不乱码
        // 中文不要太多，最多支持17个中文，因为header有150个字节限制。
        // 这一步一定要在读取文件之后进行，否则文件名会乱码，找不到文件
        fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
        // 设置下载弹窗的文件名和格式（文件名要包括名字和文件格式）
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        // 返回数据到输出流对象中
        outputStream.write(bytes);
        // 关闭流对象
        IoUtil.close(outputStream);
    }

}
