在项目中有这么一个需求:判断上传文件的类型,考虑两种方案:
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
相关推荐
- Java的`java.nio.file.Files`类和`java.net.URLConnection`类可以用来获取文件的MIME类型。 3. **文件类型检测**: - 使用`java.nio.file.Files.probeContentType()`方法可以探测文件的实际内容类型,基于文件...
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = in.readLine()) != null) { ...
InputStream inputStream= urlConnection.getInputStream(); //4.获取文件格式 String format= "MP4"; if (format.equalsIgnoreCase("mp4")) { response.addHeader("Content-Type","video/mp4;cahrset:...
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。程序可以通过URLConnection实例向该URL发送请求,读取URL引用的资源。 程序Demo示范了如何向Web站点发送GET请求、...
22-网络编程(URL-URLConnection).avi
返回的`URLConnection`对象是所有类型连接的抽象基类,具体类型取决于所使用的协议。 2. **建立连接** - `connect()`: 要真正建立与远程服务器的连接,必须调用`URLConnection`对象的`connect()`方法。这一步通常...
* 使用URLConnection下载文件或图片并保存到本地。 * * @author 老紫竹(laozizhu.com) */ public class URLConnectionDownloader { public static void main(String[] args) throws Exception { ...
这通常涉及到打开一个输入流(如`URLConnection.openStream()`),从该流中读取数据,并将其写入到本地文件的相应位置。为了提高效率,我们通常使用`RandomAccessFile`类,它可以随机访问文件的任意位置,非常适合...
URLConnection.getFileNameMap()方法可以根据文件的扩展名来检测文件的ContentType。 ```java public static String getContentTypeByType(String fileUrl) { String contentType = null; try { FileNameMap ...
String mimeType = URLConnection.guessContentTypeFromName(filePath); return mimeType != null ? mimeType : "application/octet-stream"; // 如果无法猜测,使用默认的二进制流类型 } ``` 以上代码展示了如何...
- 设置请求方法,如`urlConnection.setRequestMethod("GET")`或`urlConnection.setRequestMethod("POST")`。 - 可以设置请求头,如`urlConnection.setRequestProperty("Content-Type", "application/json")`。 - ...
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String inputLine; StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null...
URLConnection对象提供了设置请求属性的方法,如设置请求方法(GET、POST等)、设置请求头(如User-Agent、Content-Type等)以及设置超时等。例如,要发送POST请求并设置Content-Type为application/json,可以这样做...
okhttp-urlconnection-3.4.1.jar okhttp-urlconnection okhttp-urlconnection-3.4.1.jar下载
在Android开发中,与服务器进行数据交互是常见的需求,而`URLConnection`是Java标准库提供的一种基础网络通信组件,适用于Android平台。本文将详细介绍如何在Android应用中使用`URLConnection`来提交HTTP请求,包括...
okhttp-urlconnection:3.10.0
`java.net.URLConnection`是Java标准库提供的一种基础网络连接类,可以用来处理各种类型的网络连接,包括HTTP。以下是如何利用`java.net.URLConnection`发送HTTP请求的详细步骤: 1. **创建URL对象**: 首先,你...
对于URLConnection,服务器需要实现HTTP服务,监听HTTP请求,并根据请求类型(GET或POST)处理文件上传或下载。 2. **客户端**:创建Socket连接到服务器,或者构造URL,通过`openConnection()`获取URLConnection...
- 读取响应:`InputStream in = new BufferedInputStream(urlConnection.getInputStream());` - 关闭连接:`urlConnection.disconnect();` 4. **使用OkHttp**: - OkHttp是一个高效的HTTP客户端,提供异步和同步...
urlConnection.setRequestProperty("User-Agent", "Android App"); // 连接并获取输入流 urlConnection.connect(); InputStream in = urlConnection.getInputStream(); // 使用GBK编码读取HTML内容 BufferedReader...