Java 如何获取多部分文件的实际扩展名类型
我在这里检查了答案,但在这里,他们首先将它保存到某个地方,然后读取它的流,并尝试检查该文件的Mime类型 但我想知道文件类型,甚至在保存到硬盘或其他地方之前 我知道我可以用另外两种方法来做Java 如何获取多部分文件的实际扩展名类型,java,file,mime-types,Java,File,Mime Types,我在这里检查了答案,但在这里,他们首先将它保存到某个地方,然后读取它的流,并尝试检查该文件的Mime类型 但我想知道文件类型,甚至在保存到硬盘或其他地方之前 我知道我可以用另外两种方法来做 File savedFile = new File(fileHandler.createTodayFolder(fileLocation) + "/" + name); Path path = Paths.get(file.get); Tika tika =
File savedFile = new File(fileHandler.createTodayFolder(fileLocation) + "/" + name);
Path path = Paths.get(file.get);
Tika tika = new Tika();
String checkType = tika.detect(path.toFile());
及
但在这两种情况下,他们都在使用某个文件,该文件已经位于硬盘的某个位置。
我想要这样的代码
public @ResponseBody ResponseEntity<?> importResume(@RequestParam(value = "name", required = false) String name,
@RequestParam("file") MultipartFile file) {
if (file!=DESIRED_TYPE)
{
return Exception;
}
}
public@ResponseBody ResponseEntity importResume(@RequestParam(value=“name”,required=false)字符串名,
@RequestParam(“文件”)多部分文件{
如果(文件!=所需类型)
{
返回异常;
}
}
有什么方法可以做到这一点吗?您可以通过制作映射将mimetype映射到现有的扩展名 您可以使用apache.mime.types创建一个,如下所示:
这样,您可以从内容类型获取扩展名…要获取文件扩展名,您可以执行以下操作:
multipartFile.getOriginalFilename().split("\\.")[1];
您使用的名称:
multipartFile.getOriginalFilename().split("\\.")[0];
如果用户上载扩展名为.doc的可执行文件,该怎么办?您可以获得以下内容类型:
multipartFile.getContentType();
这将返回MIME类型的字符串。
要获得正确的文件扩展名,您可以在文件名字符串中搜索最后一个点,然后在此位置拆分它。您可以使用Tika
这将在不保存文件的情况下获得mimetype我通过打开拆分解决了这个问题。最后一部分(不是第二部分) 分机
String[] fileFrags = file.getOriginalFilename().split("\\.")
String extension = fileFrags[fileFrags.length-1]
得名
String fileName = file.substring(0,file.lenghth()-fileFrags[fileFrags-1].length()-1)
对我来说,最干净的解决方案是: 使用org.apache.commons.io的FilenameUtils:
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
给定字符串
文件名
,您可以执行以下操作:
filename.substring(filename.lastIndexOf(".") + 1);
您可以使用
org.springframework.util.StringUtils
:
String extension = StringUtils.getFilenameExtension(file.getOriginalFilename());
您需要开始对其进行流式传输(读取),否则无法检查MIME。@PetterFriberg-所以我所做的是正确的还是错误的??我想它在一个流中出现,在保存到hd之前,请检查该流的MIME类型。。。。如果确定,则保存,否则不…@PetterFriberg-它是一个多部分文件,目前我将它保存为文件,然后检查它的类型,出于安全目的,该类型是错误的。我想,如果有人上传了一个可执行文件并将其命名为某个doc文件,那么这就行不通了。或者,如果有人上传一个扩展名为2的文件,那么它也将不起作用。如果您的文件名带有点,则此解决方案将不起作用,例如-“屏幕截图2017-03-03 at 6.56.04 PM.png”。请仔细阅读答案:“[…]您可以在文件名字符串中搜索最后一个点[…]”此解决方案仅验证与mime类型(即,有人上载了扩展名为.doc的.exe文件)没有直接连接的文件扩展名,但他需要从多部分文件访问此文件,而不是像他在eg中所给出的字符串。controller@valik要获取文件名,只需使用
file.getOriginalFilename()
文档中的注意事项:IllegalArgumentException
在Windows上是可能的。该方法过去对“foo.exe:bar.txt”等名称存在隐藏问题。在本例中,名称不是文件名,而是文件foo.exe上的备用数据流(bar.txt)的标识符。用于在此处返回“.txt”的方法,这可能会产生误导。Commons IO 2.7及更高版本正在为此类名称抛出一个IllegalArgumentException
。小心!此方法仅检查文件路径的文件扩展名。它实际上并不检查可能与扩展名不同的文件字节。即使在重命名文件后,它们也会检测原始文件类型。谢谢:)
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
filename.substring(filename.lastIndexOf(".") + 1);
String extension = FilenameUtils.getExtension(inputFile.getOriginalFilename());
System.out.println("File Extension "+extension);
String extension = StringUtils.getFilenameExtension(file.getOriginalFilename());