`

慎用URLConnection.guessContentTypeFromStream推断文件mime类型

阅读更多

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

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


print result:
FileInputStream mime:null
BufferedInputStream mime:image/png

 

 

  • 大小: 28.5 KB
分享到:
评论

相关推荐

    swing+mime测试文件类型源码

    - Java的`java.nio.file.Files`类和`java.net.URLConnection`类可以用来获取文件的MIME类型。 3. **文件类型检测**: - 使用`java.nio.file.Files.probeContentType()`方法可以探测文件的实际内容类型,基于文件...

    URL以及URLConnection的使用

    BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = in.readLine()) != null) { ...

    实现视频在线播放.zip

    InputStream inputStream= urlConnection.getInputStream(); //4.获取文件格式 String format= "MP4"; if (format.equalsIgnoreCase("mp4")) { response.addHeader("Content-Type","video/mp4;cahrset:...

    Android移动开发-使用URLConnection提交请求的实现

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。程序可以通过URLConnection实例向该URL发送请求,读取URL引用的资源。 程序Demo示范了如何向Web站点发送GET请求、...

    22-网络编程(URL-URLConnection).avi

    22-网络编程(URL-URLConnection).avi

    例10.03 使用URLConnection对象访问远程文件.rar_remote access java_url_远程文件

    返回的`URLConnection`对象是所有类型连接的抽象基类,具体类型取决于所使用的协议。 2. **建立连接** - `connect()`: 要真正建立与远程服务器的连接,必须调用`URLConnection`对象的`connect()`方法。这一步通常...

    使用urlconnection下载文件或图片并保存到本地

    * 使用URLConnection下载文件或图片并保存到本地。 * * @author 老紫竹(laozizhu.com) */ public class URLConnectionDownloader { public static void main(String[] args) throws Exception { ...

    使用URL和URLConnection(多线程下载)

    这通常涉及到打开一个输入流(如`URLConnection.openStream()`),从该流中读取数据,并将其写入到本地文件的相应位置。为了提高效率,我们通常使用`RandomAccessFile`类,它可以随机访问文件的任意位置,非常适合...

    Java获取文件ContentType案例

    URLConnection.getFileNameMap()方法可以根据文件的扩展名来检测文件的ContentType。 ```java public static String getContentTypeByType(String fileUrl) { String contentType = null; try { FileNameMap ...

    Servlet 下载文件

    String mimeType = URLConnection.guessContentTypeFromName(filePath); return mimeType != null ? mimeType : "application/octet-stream"; // 如果无法猜测,使用默认的二进制流类型 } ``` 以上代码展示了如何...

    java实现读取证书访问https接口

    - 设置请求方法,如`urlConnection.setRequestMethod("GET")`或`urlConnection.setRequestMethod("POST")`。 - 可以设置请求头,如`urlConnection.setRequestProperty("Content-Type", "application/json")`。 - ...

    https网络请求,包含get和post形式

    BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String inputLine; StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null...

    通过java.net.URLConnection发送HTTP请求

    URLConnection对象提供了设置请求属性的方法,如设置请求方法(GET、POST等)、设置请求头(如User-Agent、Content-Type等)以及设置超时等。例如,要发送POST请求并设置Content-Type为application/json,可以这样做...

    okhttp-urlconnection-3.4.1.jar下载

    okhttp-urlconnection-3.4.1.jar okhttp-urlconnection okhttp-urlconnection-3.4.1.jar下载

    Android使用URLConnection提交请求的实现

    在Android开发中,与服务器进行数据交互是常见的需求,而`URLConnection`是Java标准库提供的一种基础网络通信组件,适用于Android平台。本文将详细介绍如何在Android应用中使用`URLConnection`来提交HTTP请求,包括...

    okhttp-urlconnection:3.10.0.jar

    okhttp-urlconnection:3.10.0

    java如何利用java.net.URLConnection发送HTTP.docx

    `java.net.URLConnection`是Java标准库提供的一种基础网络连接类,可以用来处理各种类型的网络连接,包括HTTP。以下是如何利用`java.net.URLConnection`发送HTTP请求的详细步骤: 1. **创建URL对象**: 首先,你...

    一个通过Socket或URLConnection传文件的示例

    对于URLConnection,服务器需要实现HTTP服务,监听HTTP请求,并根据请求类型(GET或POST)处理文件上传或下载。 2. **客户端**:创建Socket连接到服务器,或者构造URL,通过`openConnection()`获取URLConnection...

    Android基础 网络通信

    - 读取响应:`InputStream in = new BufferedInputStream(urlConnection.getInputStream());` - 关闭连接:`urlConnection.disconnect();` 4. **使用OkHttp**: - OkHttp是一个高效的HTTP客户端,提供异步和同步...

    Android例子源码使用HttpClient获取网页html源代码

    urlConnection.setRequestProperty("User-Agent", "Android App"); // 连接并获取输入流 urlConnection.connect(); InputStream in = urlConnection.getInputStream(); // 使用GBK编码读取HTML内容 BufferedReader...

Global site tag (gtag.js) - Google Analytics