Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取多部分文件的实际扩展名类型_Java_File_Mime Types - Fatal编程技术网

Java 如何获取多部分文件的实际扩展名类型

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 =

我在这里检查了答案,但在这里,他们首先将它保存到某个地方,然后读取它的流,并尝试检查该文件的Mime类型

但我想知道文件类型,甚至在保存到硬盘或其他地方之前

我知道我可以用另外两种方法来做

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());