> 文章列表 > 如何根据文件名获取Content-Type?

如何根据文件名获取Content-Type?

如何根据文件名获取Content-Type?

目录

  • 前言
  • 第一种方式
    • 效果
  • 第二种方式
    • 测试
    • 效果

前言

最近我们集团部门搭建了对象存储服务器,我们之前使用的是第三方的按量付费,太贵扛不住了,所以自己搭建自己使用,发现在上传之后,去访问,都是直接下载,没有在浏览器出现浏览页面,看样子请求头都是application/octet-stream,所以有必要手动解决了,解决的方式就是上传文件的时候,动态根据上传的文件类型设置Content-Type,解决方式有很多种,你可以使用Spring提供的也可以自己解决,下面我列出了不同使用方式,以及效果。

第一种方式

使用Spring提供的MediaTypeFactory

import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;import java.util.Optional;/* @author lwh* @date 2023/4/6* @description/
public class ContentTypeTest {public static void main(String[] args) {// 根据文件名获取content_typeString[] fileNames = new String[]{"file/.test.PNG", "测试.pdf", "视频.xx"};for (String fileName : fileNames) {Optional<MediaType> mediaType = MediaTypeFactory.getMediaType(fileName);System.out.println(mediaType.orElse(MediaType.APPLICATION_OCTET_STREAM).toString());}}
}

效果

如何根据文件名获取Content-Type?

第二种方式


import lombok.Getter;
import org.springframework.util.StringUtils;/* @author lwh* @date 2023/4/6* @description 通过文件扩展名获取ContentType/
@Getter
public enum MimeTypeEnum {AAC("acc", "AAC音频", "audio/aac"),ABW("abw", "AbiWord文件", "application/x-abiword"),ARC("arc", "存档文件", "application/x-freearc"),AVI("avi", "音频视频交错格式", "video/x-msvideo"),AZW("azw", "亚马逊Kindle电子书格式", "application/vnd.amazon.ebook"),BIN("bin", "任何类型的二进制数据", "application/octet-stream"),BMP("bmp", "Windows OS / 2位图图形", "image/bmp"),BZ("bz", "BZip存档", "application/x-bzip"),BZ2("bz2", "BZip2存档", "application/x-bzip2"),CSH("csh", "C-Shell脚本", "application/x-csh"),CSS("css", "级联样式表(CSS)", "text/css"),CSV("csv", "逗号分隔值(CSV)", "text/csv"),DOC("doc", "微软Word文件", "application/msword"),DOCX("docx", "Microsoft Word(OpenXML)", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"),EOT("eot", "MS Embedded OpenType字体", "application/vnd.ms-fontobject"),EPUB("epub", "电子出版物(EPUB)", "application/epub+zip"),GZ("gz", "GZip压缩档案", "application/gzip"),GIF("gif", "图形交换格式(GIF)", "image/gif"),HTM("htm", "超文本标记语言(HTML)", "text/html"),HTML("html", "超文本标记语言(HTML)", "text/html"),ICO("ico", "图标格式", "image/vnd.microsoft.icon"),ICS("ics", "iCalendar格式", "text/calendar"),JAR("jar", "Java存档", "application/java-archive"),JPEG("jpeg", "JPEG图像", "image/jpeg"),JPG("jpg", "JPEG图像", "image/jpeg"),JS("js", "JavaScript", "text/javascript"),JSON("json", "JSON格式", "application/json"),JSONLD("jsonld", "JSON-LD格式", "application/ld+json"),MID("mid", "乐器数字接口(MIDI)", "audio/midi"),MIDI("midi", "乐器数字接口(MIDI)", "audio/midi"),MJS("mjs", "JavaScript模块", "text/javascript"),MP3("mp3", "MP3音频", "audio/mpeg"),MPEG("mpeg", "MPEG视频", "video/mpeg"),MPKG("mpkg", "苹果安装程序包", "application/vnd.apple.installer+xml"),ODP("odp", "OpenDocument演示文稿文档", "application/vnd.oasis.opendocument.presentation"),ODS("ods", "OpenDocument电子表格文档", "application/vnd.oasis.opendocument.spreadsheet"),ODT("odt", "OpenDocument文字文件", "application/vnd.oasis.opendocument.text"),OGA("oga", "OGG音讯", "audio/ogg"),OGV("ogv", "OGG视频", "video/ogg"),OGX("ogx", "OGG", "application/ogg"),OPUS("opus", "OPUS音频", "audio/opus"),OTF("otf", "otf字体", "font/otf"),PNG("png", "便携式网络图形", "image/png"),PDF("pdf", "Adobe 可移植文档格式(PDF)", "application/pdf"),PHP("php", "php", "application/x-httpd-php"),PPT("ppt", "Microsoft PowerPoint", "application/vnd.ms-powerpoint"),PPTX("pptx", "Microsoft PowerPoint(OpenXML)", "application/vnd.openxmlformats-officedocument.presentationml.presentation"),RAR("rar", "RAR档案", "application/vnd.rar"),RTF("rtf", "富文本格式", "application/rtf"),SH("sh", "Bourne Shell脚本", "application/x-sh"),SVG("svg", "可缩放矢量图形(SVG)", "image/svg+xml"),SWF("swf", "小型Web格式(SWF)或Adobe Flash文档", "application/x-shockwave-flash"),TAR("tar", "磁带存档(TAR)", "application/x-tar"),TIF("tif", "标记图像文件格式(TIFF)", "image/tiff"),TIFF("tiff", "标记图像文件格式(TIFF)", "image/tiff"),TS("ts", "MPEG传输流", "video/mp2t"),TTF("ttf", "ttf字体", "font/ttf"),TXT("txt", "文本(通常为ASCII或ISO 8859- n", "text/plain"),VSD("vsd", "微软Visio", "application/vnd.visio"),WAV("wav", "波形音频格式", "audio/wav"),WEBA("weba", "WEBM音频", "audio/webm"),WEBM("webm", "WEBM视频", "video/webm"),WEBP("webp", "WEBP图像", "image/webp"),WOFF("woff", "Web开放字体格式(WOFF)", "font/woff"),WOFF2("woff2", "Web开放字体格式(WOFF)", "font/woff2"),XHTML("xhtml", "XHTML", "application/xhtml+xml"),XLS("xls", "微软Excel", "application/vnd.ms-excel"),XLSX("xlsx", "微软Excel(OpenXML)", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),XML("xml", "XML", "application/xml"),XUL("xul", "XUL", "application/vnd.mozilla.xul+xml"),ZIP("zip", "ZIP", "application/zip"),MIME_3GP("3gp", "3GPP audio/video container", "video/3gpp"),MIME_3GP_WITHOUT_VIDEO("3gp", "3GPP audio/video container doesn't contain video", "audio/3gpp2"),MIME_3G2("3g2", "3GPP2 audio/video container", "video/3gpp2"),MIME_3G2_WITHOUT_VIDEO("3g2", "3GPP2 audio/video container  doesn't contain video", "audio/3gpp2"),MIME_7Z("7z", "7-zip存档", "application/x-7z-compressed");//扩展名private final String extension;//说明private final String explain;//contentType/mime类型private final String mimeType;/* @param extension 上传的文件扩展名* @param explain   类型说明* @param mimeType  Mime对应的类型*/MimeTypeEnum(String extension, String explain, String mimeType) {this.extension = extension;this.explain = explain;this.mimeType = mimeType;}/* 通过扩展名获取枚举类型 @param extension 扩展名* @return 枚举类*/public static MimeTypeEnum getByExtension(String extension) {if (StringUtils.isEmpty(extension)) {return null;}for (MimeTypeEnum typesEnum : MimeTypeEnum.values()) {if (extension.toLowerCase().equals(typesEnum.getExtension())) {return typesEnum;}}return null;}/* Content-Type常用对照* 根据后缀获取Mime @param fileType 扩展名* @return mime类型*/public static String getContentType(String fileType) {MimeTypeEnum mimeTypeEnum = MimeTypeEnum.getByExtension(fileType);if (mimeTypeEnum != null) {return mimeTypeEnum.getMimeType();}return "application/octet-stream";}/* Content-Type常用对照* 根据文件名获取Mime @param objectName 文件名* @return mime类型*/public static String getContentTypeByObjectName(String objectName) {if (StringUtils.isEmpty(objectName)) {return null;}MimeTypeEnum mimeTypeEnum = MimeTypeEnum.getByExtension(objectName.substring(objectName.lastIndexOf(".") + 1));if (mimeTypeEnum != null) {return mimeTypeEnum.getMimeType();}return "application/octet-stream";}}

测试

/* @author lwh* @date 2023/4/6* @description/
public class ContentTypeTest {public static void main(String[] args) {// 根据文件名获取content_typeString[] fileNames = new String[]{"file/.test.PNG", "测试.pdf", "视频.xx"};for (String fileName : fileNames) {String contentType = MimeTypeEnum.getContentTypeByObjectName(fileName);System.out.println(contentType);}}
}

效果

如何根据文件名获取Content-Type?

2种方式都没问题,我使用的是第二种,第一种在不同的项目里可能会报找不到MediaTypeFactory,原因就是缺少依赖自己导入,大家视情况选择。