在java中获取文件的mime类型

ecfdbz9o  于 2021-06-20  发布在  Mysql
关注(0)|答案(24)|浏览(706)

我只是想知道大多数人是如何从java文件中获取mime类型的?到目前为止,我已经尝试了两种方法: JMimeMagic & Mime-Util .
第一个给了我内存异常,第二个没有正确关闭它的流。我只是想知道是否有其他人有一个方法/库,他们使用和工作正常?

zaq34kh6

zaq34kh61#

来自印度:

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");
xqkwcwgp

xqkwcwgp2#

上传文件最好使用两层验证。
首先,您可以检查mimetype并验证它。
其次,您应该将文件的前4个字节转换为十六进制,然后将其与幻数进行比较。然后它将是一种真正安全的方法来检查文件验证。

wko9yo5t

wko9yo5t3#

如果您是android开发人员,那么可以使用实用程序类 android.webkit.MimeTypeMap 它将mime类型Map到文件扩展名,反之亦然。
下面的代码片段可能会对您有所帮助。

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
disho6za

disho6za4#

在尝试了其他各种库之后,我决定使用mime util。

<groupId>eu.medsea.mimeutil</groupId>
      <artifactId>mime-util</artifactId>
      <version>2.1.3</version>
</dependency>

File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);
kxxlusnw

kxxlusnw5#

Apache提卡。

<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.24</version>
</dependency>

两行代码。

Tika tika=new Tika();
tika.detect(inputStream);

下面的屏幕截图

7fyelxc5

7fyelxc56#

我尝试了几种方法,包括@joshua fox说的第一种。但是有些人不能识别像pdf文件那样的频繁的mimetype,而另一些人不能信任假文件(我尝试了一个扩展名改为tif的rar文件)。正如@joshua fox所言,我找到的解决方案是使用mimeutil2,如下所示:

MimeUtil2 mimeUtil = new MimeUtil2();
mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();
llmtgqce

llmtgqce7#

如果你坚持使用Java5-6,那么这个工具类来自servoy开源产品。
你只需要这个函数

public static String getContentType(byte[] data, String name)

它探测内容的第一个字节,并基于该内容而不是文件扩展名返回内容类型。

xwmevbvl

xwmevbvl8#

用我的5美分
tl博士
我使用mimetypesfiletypemap,并将任何不存在的、我特别需要的mime添加到mime.types文件中。
现在,长文写道:
首先,mime类型列表非常庞大,请参见:https://www.iana.org/assignments/media-types/media-types.xhtml
我喜欢先使用jdk提供的标准设施,如果这不起作用,我会去找别的东西。
根据文件扩展名确定文件类型
从1.6开始,java就有了mimetypesfiletypemap,正如上面的一个答案所指出的,这是确定mime类型的最简单方法:

new MimetypesFileTypeMap().getContentType( fileName );

在它的vanilla实现中,这做的不多(即,它适用于.html,但不适用于.png)。但是,添加您可能需要的任何内容类型都非常简单:
在项目的meta inf文件夹中创建名为“mime.types”的文件
为您需要的每个mime类型添加一行,而默认实现没有提供(有数百种mime类型,列表会随着时间的推移而增长)。
png和js文件的示例条目如下:

image/png png PNG
application/javascript js

有关mime.types文件格式,请参阅此处的更多详细信息:https://docs.oracle.com/javase/7/docs/api/javax/activation/mimetypesfiletypemap.html
根据文件内容确定文件类型
从1.7开始,java就有了java.nio.file.spi.filetypedetector,它定义了一个标准api,用于以特定于实现的方式确定文件类型。
要获取文件的mime类型,只需使用文件并在代码中执行以下操作:

Files.probeContentType(Paths.get("either file name or full path goes here"));

api定义提供了支持从文件名或文件内容(魔法字节)确定文件mime类型的工具。这就是为什么probecontenttype()方法抛出ioexception,以防此api的实现使用提供给它的路径来实际尝试打开与其关联的文件。
同样,这个(jdk附带的)的普通实现还有很多需要改进的地方。
在银河系中的某个理想世界里,在很远很远的地方,所有这些试图解决这个文件到mime类型问题的库都只需实现java.nio.file.spi.filetypedetector,您可以将首选实现库的jar文件放入类路径中,就是这样。
在现实世界中,你需要tl,dr部分,你应该找到在它的名字旁边有很多星星的库并使用它。对于这个特殊的情况,我不需要一个。

gzszwxb4

gzszwxb49#

如果您使用的是servlet,并且servlet上下文对您可用,则可以使用:

getServletContext().getMimeType( fileName );
jjhzyzn0

jjhzyzn010#

如果您在linux操作系统上工作,那么就有一个命令行 file --mimetype :

String mimetype(file){

   //1. run cmd
   Object cmd=Runtime.getRuntime().exec("file --mime-type "+file);

   //2 get output of cmd , then 
    //3. parse mimetype
    if(output){return output.split(":")[1].trim(); }
    return "";
}

然后

mimetype("/home/nyapp.war") //  'application/zip'

mimetype("/var/www/ggg/au.mp3") //  'audio/mp3'
nnt7mjpx

nnt7mjpx11#

在spring多部件文件中;
org.springframework.web.multipart.multipartfile文件 file.getContentType();

voase2hg

voase2hg12#

public String getFileContentType(String fileName) {
    String fileType = "Undetermined";
    final File file = new File(fileName);
    try
    {
        fileType = Files.probeContentType(file.toPath());
    }
    catch (IOException ioException)
    {
        System.out.println(
                "ERROR: Unable to determine file type for " + fileName
                        + " due to exception " + ioException);
    }
    return fileType;
}
cs7cruho

cs7cruho13#

简单且最佳的选项是从文件位置检索内容mime类型。
使用此导入

import java.nio.file.Files;
import java.nio.file.Path;

代码

String type = Files.probeContentType(Path.of(imagePath));
inkz8wg9

inkz8wg914#

不幸的是,

mimeType = file.toURL().openConnection().getContentType();

不起作用,因为使用url会使文件处于锁定状态,例如,它是不可删除的。
但是,您有:

mimeType= URLConnection.guessContentTypeFromName(file.getName());

还有下面的内容,它的优点不仅仅是使用文件扩展名,还可以查看内容

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
 //...close stream

但是,正如上面的评论所建议的,mime类型的内置表是非常有限的,例如不包括msword和pdf。因此,如果您想进行概括,就需要超越内置库,使用mime util(这是一个很棒的库,同时使用文件扩展名和内容)。

tkclm6bt

tkclm6bt15#

jafapi是jdk6的一部分。看看 javax.activation 包裹。
最有趣的课程是 javax.activation.MimeType -一个实际的mime类型持有者-和 javax.activation.MimetypesFileTypeMap -类的示例可以将mime类型解析为文件的字符串:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);

相关问题