HTTP 下载文件工具类

 

ResponseUtils.java

package javax.utils;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * HTTP 输出响应内容工具类
 * 
 * @author Logan
 * @createDate 2019-02-13
 * @version 1.0.0
 *
 */
public class ResponseUtils {

    /**
     * 发送HTTP响应信息
     * 
     * @param response HTTP响应对象
     * @param message 信息内容
     * @throws IOException 抛出异常,由调用者捕获处理
     */
    public static void write(HttpServletResponse response, String message) throws IOException {
        response.setContentType("text/html;charset=UTF-8");

        try (
                PrintWriter writer = response.getWriter();
        ) {
            writer.write(message);
            writer.flush();
        }
    }

    /**
     * 发送HTTP响应信息,JSON格式
     * 
     * @param response HTTP响应对象
     * @param message 输出对象
     * @throws IOException 抛出异常,由调用者捕获处理
     */
    public static void write(HttpServletResponse response, Object message) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        ObjectMapper mapper = new ObjectMapper();

        try (
                PrintWriter writer = response.getWriter();
        ) {
            writer.write(mapper.writeValueAsString(message));
            writer.flush();
        }
    }

    /**
     * 下载文件
     * 
     * @param response HTTP响应对象
     * @param file 需要下载的文件
     * @throws IOException 抛出异常,由调用者捕获处理
     */
    public static void download(HttpServletResponse response, File file) throws IOException {
        String fileName = file.getName();
        try (
                FileInputStream in = new FileInputStream(file);
        ) {

            download(response, in, fileName);
        }
    }

    /**
     * 下载文件
     * 
     * @param response HTTP响应对象
     * @param data 需要下载的文件二进制内容
     * @param fileName 下载文件名
     * @throws IOException 抛出异常,由调用者捕获处理
     */
    public static void download(HttpServletResponse response, byte[] data, String fileName) throws IOException {
        try (
                ByteArrayInputStream in = new ByteArrayInputStream(data);
        ) {

            download(response, in, fileName);
        }
    }

    /**
     * 下载文件
     * 
     * @param response HTTP响应对象
     * @param in 输出流
     * @param fileName 下载文件名
     * @throws IOException 抛出异常,由调用者捕获处理
     */
    public static void download(HttpServletResponse response, InputStream in, String fileName) throws IOException {
        try (
                OutputStream out = response.getOutputStream();
        ) {

            // 对文件名进行URL转义,防止中文乱码
            fileName = URLEncoder.encode(fileName, "UTF-8");

            // 空格用URLEncoder.encode转义后会变成"+",所以要替换成"%20",浏览器会解码回空格
            fileName = fileName.replace("+", "%20");

            // "+"用URLEncoder.encode转义后会变成"%2B",所以要替换成"+",浏览器不对"+"进行解码
            fileName = fileName.replace("%2B", "+");
            response.setContentType("application/x-msdownload;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

            byte[] bytes = new byte[4096];
            int len = -1;
            while ((len = in.read(bytes)) != -1) {
                out.write(bytes, 0, len);
            }
            out.flush();
        }
    }

}

 

 

 

HTTP 下载文件工具类

.

posted @ 2019-02-13 21:57  诚信天下  阅读(1166)  评论(0编辑  收藏  举报