慎用URLConnection.guessContentTypeFromStream揣度文件mime类型ITeye - 千亿集团

慎用URLConnection.guessContentTypeFromStream揣度文件mime类型ITeye

2019-01-10 14:22:28 | 作者: 丹蝶 | 标签: 文件,办法,运用 | 浏览: 2192

在项目中有这么一个需求:判别上传文件的类型,考虑两种计划:

1. 经过正则表达式从文件名中获取;

2. 运用URLConnection.guessContentTypeFromStream经过文件前16个字节揣度;

 

榜首种办法明显不行谨慎(文件名可随意更改),所以选用 了第二种计划

 

// some code
FileInputStream inputFile = new FileInputStream("D:/test.pdf");
String mime = URLConnection.guessContentTypeFromStream(inputFile);
// save to mongodb......

 

一周后,偶尔发现全部上传的文件在mongo中mine字段均为空,翻读guessContentTypeFromStream办法源码有一处判别引起了我的留意:



 

 

markSupported ? 似有所悟,翻阅JDK文档后全部拨云见日:

 

markSupported
public boolean markSupported()
Tests if this input stream supports the mark and reset methods. Whether or not mark and reset are supported is an invariant property of a particular input stream instance. The markSupported method of InputStream returns false.
Returns:
true if this stream instance supports the mark and reset methods; false otherwise.
See Also:
mark(int), reset()

 

 

首要介绍一下InputStream类供给的mark与reset办法:

 在该输入流中运用mark符号当时方位,后续调用 reset 办法从头将流定坐落最终符号方位,以便后续读取。 

 

 markSupported办法能够判别当时类是否具有mark与reset办法的才能,只要重写了mark与reset办法,markSupported才会回来true。前面展现的代码运用的FileInputStream没有重写父类InputStream的这两个办法,其不具有mark和reset办法的才能,运用BufferInputStream替换FileInputStream可解决此问题:
FileInputStream inputFile = new FileInputStream("D:/t1.png");
System.out.println("FileInputStream mime:" + URLConnection.guessContentTypeFromStream(inputFile));
System.out.println("BufferedInputStream mime:" + URLConnection.guessContentTypeFromStream(new BufferedInputStream(inputFile)));                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章