From 47134c0536dc1f09ba014718279f1d68844afdf6 Mon Sep 17 00:00:00 2001
From: Zhu Kaixiao <3617246657@qq.com>
Date: Thu, 11 Mar 2021 12:10:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=BB=E5=8F=96=E6=B5=81?=
=?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB=E7=B1=BB=E5=9E=8B=E6=8C=89?=
=?UTF-8?q?=E7=85=A7=E6=89=A9=E5=B1=95=E5=90=8D=E8=AF=86=E5=88=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/hutool/core/io/FileTypeUtil.java | 47 +++++++++++++------
.../cn/hutool/core/io/FileTypeUtilTest.java | 10 ++++
2 files changed, 42 insertions(+), 15 deletions(-)
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
index 3da7555a4..d7764bce3 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
@@ -133,6 +133,7 @@ public class FileTypeUtil {
return getType(IoUtil.readHex28Upper(in));
}
+
/**
* 根据文件流的头部信息获得文件类型
*
@@ -141,27 +142,20 @@ public class FileTypeUtil {
* 2、xls、doc、msi头信息无法区分,按照扩展名区分
* 3、zip可能为docx、xlsx、pptx、jar、war头信息无法区分,按照扩展名区分
*
- *
- * @param file 文件 {@link File}
+ * @param in {@link InputStream}
+ * @param filename 文件名
* @return 类型,文件的扩展名,未找到为null
- * @throws IORuntimeException 读取文件引起的异常
+ * @throws IORuntimeException 读取流引起的异常
*/
- public static String getType(File file) throws IORuntimeException {
- String typeName;
- FileInputStream in = null;
- try {
- in = IoUtil.toStream(file);
- typeName = getType(in);
- } finally {
- IoUtil.close(in);
- }
+ public static String getType(InputStream in, String filename) {
+ String typeName = getType(in);
if (null == typeName) {
// 未成功识别类型,扩展名辅助识别
- typeName = FileUtil.extName(file);
+ typeName = FileUtil.extName(filename);
} else if ("xls".equals(typeName)) {
// xls、doc、msi的头一样,使用扩展名辅助判断
- final String extName = FileUtil.extName(file);
+ final String extName = FileUtil.extName(filename);
if ("doc".equalsIgnoreCase(extName)) {
typeName = "doc";
} else if ("msi".equalsIgnoreCase(extName)) {
@@ -169,7 +163,7 @@ public class FileTypeUtil {
}
} else if ("zip".equals(typeName)) {
// zip可能为docx、xlsx、pptx、jar、war等格式,扩展名辅助判断
- final String extName = FileUtil.extName(file);
+ final String extName = FileUtil.extName(filename);
if ("docx".equalsIgnoreCase(extName)) {
typeName = "docx";
} else if ("xlsx".equalsIgnoreCase(extName)) {
@@ -185,6 +179,29 @@ public class FileTypeUtil {
return typeName;
}
+ /**
+ * 根据文件流的头部信息获得文件类型
+ *
+ *
+ * 1、无法识别类型默认按照扩展名识别 + * 2、xls、doc、msi头信息无法区分,按照扩展名区分 + * 3、zip可能为docx、xlsx、pptx、jar、war头信息无法区分,按照扩展名区分 + *+ * + * @param file 文件 {@link File} + * @return 类型,文件的扩展名,未找到为
null
+ * @throws IORuntimeException 读取文件引起的异常
+ */
+ public static String getType(File file) throws IORuntimeException {
+ FileInputStream in = null;
+ try {
+ in = IoUtil.toStream(file);
+ return getType(in, file.getName());
+ } finally {
+ IoUtil.close(in);
+ }
+ }
+
/**
* 通过路径获得文件类型
*
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
index 16b8d2bea..148f2950a 100644
--- a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java
@@ -6,6 +6,7 @@ import org.junit.Ignore;
import org.junit.Test;
import java.io.File;
+import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -56,4 +57,13 @@ public class FileTypeUtilTest {
Assert.assertEquals("ofd", type);
}
+
+ @Test
+ @Ignore
+ public void inputStreamAndFilenameTest() {
+ File file = FileUtil.file("e:/laboratory/test.xlsx");
+ String type = FileTypeUtil.getType(file);
+ Assert.assertEquals("xlsx", type);
+ }
+
}