Java 根据 User-Agent 返回 Content-Disposition

iBit程序猿 2021年06月15日 682次浏览

记 Java 根据 User-Agent 返回 Content-Disposition

/**
 * 默认编码名称
 */
private static final String DEFAULT_CHARSET_NAME = "UTF-8";


/**
 * 通过"User-Agent"和原始文件名获取"Content-Disposition"
 *
 * @param userAgent "User-Agent"
 * @param filename  原始文件名
 * @return Content-Disposition
 */
public String getContentDisposition(String userAgent, String filename) {
    if (StringUtils.isBlank(filename)) {
        return null;
    }
    return String.format("attachment; %s", getFilenameByUserAgent(userAgent, filename));
}

/**
 * 获取url编码后的文件名称
 *
 * @param name 名称
 * @return 编码后的名称
 */
public String getUrlEncodeName(String name) {
    name = StringUtils.trimToEmpty(name);
    try {
        return name.isEmpty() ? name : URLEncoder.encode(name, DEFAULT_CHARSET_NAME).replaceAll("\\+", "%20");
    } catch (UnsupportedEncodingException e) {
        //ignore
        return "";
    }
}

/**
 * 通过 user-agent 构造content-disposition的 filename 部分
 *
 * @param userAgent user-agent
 * @param filename  文件名称
 * @return content-disposition的filename部分
 */
private String getFilenameByUserAgent(String userAgent, String filename) {
    //默认chrome
    String newFilename = getUrlEncodeName(filename);
    String rtn = "filename*=utf-8''" + newFilename;
    if (userAgent != null) {
        userAgent = userAgent.toLowerCase();
        // IE浏览器,只能采用URLEncoder编码
        if (userAgent.contains("msie")) {
            rtn = "filename=\"" + newFilename + "\"";
        }
    }
    return rtn;
}