FileDownloadUtil.java 1.92 KB
package com.yiboshi.science.utils;

import com.baomidou.mybatisplus.core.toolkit.IOUtils;
import org.springframework.http.ContentDisposition;
import org.springframework.http.MediaType;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class FileDownloadUtil {

    private static final MediaType MS_DOWNLOAD = new MediaType("application", "x-msdownload");

    public static void download(InputStream inputStream, HttpServletRequest request, HttpServletResponse response,
                                String fileName){
        BufferedInputStream br = null;
        OutputStream out = null;
        try{
            boolean isIE = isIE(request);
            //必须
            response.setCharacterEncoding("utf-8");
            response.setContentType(isIE ? MS_DOWNLOAD.toString() : MediaType.APPLICATION_OCTET_STREAM.toString());
            response.addHeader("Content-Disposition", ContentDisposition.builder("attachment")
                    .filename(fileName)
                    .build().toString());
            br = new BufferedInputStream(inputStream);
            out = response.getOutputStream();
            int len;
            byte[] buf = new byte[1024];
            while ((len = br.read(buf)) > 0){
                out.write(buf, 0, len);
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(br);
            IOUtils.closeQuietly(out);
        }
    }

    public static boolean isIE(HttpServletRequest request) {
        String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
        String userAgent = request.getHeader("User-Agent");
        for (String signal : IEBrowserSignals) {
            if (userAgent.contains(signal)){
                return true;
            }
        }
        return false;
    }
}