160414、java上传文件以流方式判断类型

本文介绍了一种通过读取文件头部特征来判断文件类型的实用方法。该方法利用Java编程实现了一个枚举类来存储各种文件类型的头部特征,并通过读取文件前几个字节并将其转换为十六进制字符串进行比对,从而快速识别文件格式。
public enum FileType {  
    /**  
     * JEPG.  
     */  
    JPEG("FFD8FF"),  
  
    /**  
     * PNG.  
     */  
    PNG("89504E47"),  
  
    /**  
     * GIF.  
     */  
    GIF("47494638"),  
  
    /**  
     * TIFF.  
     */  
    TIFF("49492A00"),  
  
    /**  
     * Windows Bitmap.  
     */  
    BMP("424D"),  
  
    /**  
     * CAD.  
     */  
    DWG("41433130"),  
  
    /**  
     * Adobe Photoshop.  
     */  
    PSD("38425053"),  
  
    /**  
     * Rich Text Format.  
     */  
    RTF("7B5C727466"),  
  
    /**  
     * XML.  
     */  
    XML("3C3F786D6C"),  
  
    /**  
     * HTML.  
     */  
    HTML("68746D6C3E"),  
    /**  
     * CSS.  
     */  
    CSS("48544D4C207B0D0A0942"),  
    /**  
     * JS.  
     */  
    JS("696B2E71623D696B2E71"),  
    /**  
     * Email [thorough only].  
     */  
    EML("44656C69766572792D646174653A"),  
  
    /**  
     * Outlook Express.  
     */  
    DBX("CFAD12FEC5FD746F"),  
  
    /**  
     * Outlook (pst).  
     */  
    PST("2142444E"),  
  
    /**  
     * MS Word/Excel.  
     */  
    XLS_DOC("D0CF11E0"), XLSX_DOCX("504B030414000600080000002100"),  
    /**  
     * Visio  
     */  
    VSD("d0cf11e0a1b11ae10000"),  
    /**  
     * MS Access.  
     */  
    MDB("5374616E64617264204A"),  
    /**  
     * WPS文字wps、表格et、演示dps都是一样的  
     */  
    WPS("d0cf11e0a1b11ae10000"),  
    /**  
     * torrent  
     */  
    TORRENT("6431303A637265617465"),  
    /**  
     * WordPerfect.  
     */  
    WPD("FF575043"),  
  
    /**  
     * Postscript.  
     */  
    EPS("252150532D41646F6265"),  
  
    /**  
     * Adobe Acrobat.  
     */  
    PDF("255044462D312E"),  
  
    /**  
     * Quicken.  
     */  
    QDF("AC9EBD8F"),  
  
    /**  
     * Windows Password.  
     */  
    PWL("E3828596"),  
  
    /**  
     * ZIP Archive.  
     */  
    ZIP("504B0304"),  
  
    /**  
     * RAR Archive.  
     */  
    RAR("52617221"),  
    /**  
     * JSP Archive.  
     */  
    JSP("3C2540207061676520"),  
    /**  
     * JAVA Archive.  
     */  
    JAVA("7061636B61676520"),  
    /**  
     * CLASS Archive.  
     */  
    CLASS("CAFEBABE0000002E00"),  
    /**  
     * JAR Archive.  
     */  
    JAR("504B03040A000000"),  
    /**  
     * MF Archive.  
     */  
    MF("4D616E69666573742D56"),  
    /**  
     *EXE Archive.  
     */  
    EXE("4D5A9000030000000400"),  
    /**  
     *CHM Archive.  
     */  
    CHM("49545346030000006000"),  
    /*  
     * INI("235468697320636F6E66"), SQL("494E5345525420494E54"), BAT(  
     * "406563686F206f66660D"), GZ("1F8B0800000000000000"), PROPERTIES(  
     * "6C6F67346A2E726F6F74"), MXP(  
     * "04000000010000001300"),  
     */  
    /**  
     * Wave.  
     */  
    WAV("57415645"),  
  
    /**  
     * AVI.  
     */  
    AVI("41564920"),  
  
    /**  
     * Real Audio.  
     */  
    RAM("2E7261FD"),  
  
    /**  
     * Real Media.  
     */  
    RM("2E524D46"),  
  
    /**  
     * MPEG (mpg).  
     */  
    MPG("000001BA"),  
  
    /**  
     * Quicktime.  
     */  
    MOV("6D6F6F76"),  
  
    /**  
     * Windows Media.  
     */  
    ASF("3026B2758E66CF11"),  
  
    /**  
     * MIDI.  
     */  
    MID("4D546864"),  
    /**  
     * MP4.  
     */  
    MP4("00000020667479706d70"),  
    /**  
     * MP3.  
     */  s
    MP3("49443303000000002176"),  
    /**  
     * FLV.  
     */  
    FLV("464C5601050000000900");  
    private String value = "";  
  
    /**  
     * Constructor.  
     *   
     * @param type  
     */  
    private FileType(String value) {  
        this.value = value;  
    }  
  
    public String getValue() {  
        return value;  
    }  
  
    public void setValue(String value) {  
        this.value = value;  
    }  
  
}  
 
 
 
 
 
 
public final class FileTypeJudge {  
/** * Constructor */  
private FileTypeJudge() {}  
/** * 将文件头转换成16进制字符串 * * @param 原生byte * @return 16进制字符串 */  
private static String bytesToHexString(byte[] src) {  
StringBuilder stringBuilder = new StringBuilder();  
if (src == null || src.length <= 0) {  
return null;  
}  
for (int i = 0; i < src.length; i++) {  
int v = src[i] & 0xFF;  
String hv = Integer.toHexString(v);  
if (hv.length() < 2) {  
stringBuilder.append(0);  
}  
stringBuilder.append(hv);  
}  
return stringBuilder.toString();  
}  
/** * 得到文件头 * * @param filePath * 文件路径 * @return 文件头 * @throws IOException */  
private static String getFileContent(String filePath) throws IOException {  
byte[] b = new byte[28];  
InputStream inputStream = null;  
try {  
inputStream = new FileInputStream(filePath);  
inputStream.read(b, 0, 28);  
} catch (IOException e) {  
e.printStackTrace();  
throw e;}  
finally {if (inputStream != null)  
{  
try {inputStream.close();}   
catch (IOException e)   
{e.printStackTrace();throw e;}}}  
return bytesToHexString(b);}  
/** * 判断文件类型 * * @param filePath * 文件路径 * @return 文件类型 */  
public static FileType getType(String filePath) throws IOException {  
String fileHead = getFileContent(filePath);  
if (fileHead == null || fileHead.length() == 0) {  
return null;}fileHead = fileHead.toUpperCase();  
FileType[] fileTypes = FileType.values();  
for (FileType type : fileTypes) {  
if (fileHead.startsWith(type.getValue())) {  
return type;}}return null;}  
public static void main(String args[]) throws Exception {  
System.out.println(FileTypeJudge.getType("d:\\FileMonitor.java"));  
}  
}  

 

转载于:https://www.cnblogs.com/zrbfree/p/5390912.html

<think>首先,用户的问题是:“我想使用Java通过POST方法调用接口获取文件方式 请问Java 发送 POST 请求 获取文件”。这是一个关于Java编程的问题,用户想了解如何使用POST方法调用接口来获取文件。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这个问题不涉及数学表达式,所以不需要。 - 独立公式必须使用$$...$$格式并单独成段,同样,这里没有数学公式。 - LaTeX语法正确:不需要。 - 使用中文回答:必须用中文。 - 生成相关问题:在回答后生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:需要引用提供的引用内容。 用户提供的引用: - 引用[1]:展示了一个Java方法,使用HttpURLConnection发送POST请求并保存文件。 - 引用[2]:提到了RestTemplate和Httpclient发送POST请求。 - 引用[3]:涉及文件上传的content type判断。 - 引用[4]:提到了文件的处理。 这些引用是关于Java发送POST请求获取文件的代码示例。用户的问题聚焦在获取文件上。 我的回答需要: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在回答中自然地引用这些内容。 回答结构: 1. **介绍问题**:简要解释用户的需求。 2. **逐步指导**:提供使用Java发送POST请求获取文件的方法。包括使用HttpURLConnection的示例,因为引用[1]和[4]直接相关。 3. **代码示例**:基于引用[1],给出一个修改后的代码示例,专注于获取文件而不是直接保存文件4. **其他方法**:提到使用RestTemplate或HttpClient(如引用[2]所示),但保持简洁,因为用户指定了POST和文件。 5. **注意事项**:包括错误处理、编码、超时设置等。 6. **引用标识**:在引用相关段落时添加[^n]。 7. **生成相关问题**:在最后添加相关问题。 关键点: - 用户想获取文件,而不是直接保存文件。引用[1]的代码保存文件到磁盘,但用户可能需要处理。 - 所以,我会调整代码,展示如何获取InputStream,用户可以进一步处理它。 修改引用[1]的代码以获取文件: - 在代码中,当响应码为HTTP_OK时,获取InputStream。 - 然后,用户可以选择保存到文件或处理。 生成相关问题: - 基于主题,如优化、错误处理、其他库等。 最终回答大纲: 1. 介绍:解释使用Java发送POST请求获取文件的方法。 2. 方法一:使用HttpURLConnection(基于引用[1])。 - 代码示例。 3. 方法二:简要提及其他方法(如RestTemplate或HttpClient)。 4. 注意事项。 5. 相关问题。</think>### Java 发送 POST 请求获取文件的方法 在 Java 中,通过 POST 方法调用接口获取文件是常见的需求,例如下载文件或处理 API 返回的二进制数据。以下是基于标准 Java 库(如 `java.net.HttpURLConnection`)的逐步实现方法。整个过程包括设置请求、发送参数、处理响应,并确保资源正确关闭。参考您提供的引用内容,我将重点展示如何直接获取文件(`InputStream`),而不是直接保存文件,以便您灵活处理数据(如实时解析或转存)。 #### 步骤说明 1. **创建连接并设置请求参数**:使用 `HttpURLConnection` 建立 POST 请求,指定 URL、超时和编码。 2. **写入请求体**:如果接口需要参数(如 JSON 或表单数据),通过输出写入。 3. **处理响应**:检查 HTTP 状态码,成功时获取输入(`InputStream`)。 4. **资源管理**:使用 try-with-resources 确保和连接自动关闭,避免内存泄漏。 5. **错误处理**:捕获异常并记录日志。 #### 代码示例(使用 HttpURLConnection) 以下方法演示了如何发送 POST 请求并返回文件。代码基于引用[1]和引用[4]优化,专注于获取 `InputStream`,您可以根据需要保存到文件或直接处理。 ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; public class FileStreamFetcher { /** * 发送 POST 请求并获取文件 * @param url 接口 URL * @param params 请求参数(如 JSON 字符串) * @return 文件的 InputStream,如果失败返回 null */ public InputStream fetchFileStream(String url, String params) { HttpURLConnection conn = null; try { // 1. 创建并配置连接 conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(45000); // 45秒超时 conn.setReadTimeout(45000); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); // 假设发送 JSON conn.setDoOutput(true); // 允许写入参数 conn.setDoInput(true); // 允许读取响应 // 2. 写入请求参数 try (OutputStream outputStream = conn.getOutputStream()) { byte[] input = params.getBytes(StandardCharsets.UTF_8); outputStream.write(input, 0, input.length); } // 3. 检查响应状态码 int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 4. 获取文件(InputStream) return conn.getInputStream(); // 返回供外部处理 } else { System.err.println("请求失败,状态码: " + responseCode); return null; } } catch (Exception e) { e.printStackTrace(); return null; } finally { // 注意:InputStream 需要在外部关闭,连接在关闭后自动释放 if (conn != null) { conn.disconnect(); // 断开连接 } } } // 示例用法:保存文件或直接处理 public static void main(String[] args) { FileStreamFetcher fetcher = new FileStreamFetcher(); String apiUrl = "https://example.com/api/download"; String jsonParams = "{\"fileId\": \"123\"}"; // 示例参数 try (InputStream inputStream = fetcher.fetchFileStream(apiUrl, jsonParams)) { if (inputStream != null) { // 处理文件:例如保存到本地文件 String savePath = "C:/downloads/file.zip"; try (FileOutputStream out = new FileOutputStream(savePath)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } System.out.println("文件保存成功至: " + savePath); } else { System.out.println("获取文件失败"); } } catch (IOException e) { e.printStackTrace(); } } } ``` #### 关键注意事项 1. **请求头设置**:根据接口要求调整 `Content-Type`,如 `application/x-www-form-urlencoded` 或 `multipart/form-data`(上传文件时参考引用[3])。如果接口不需要参数,可省略写入步骤。 2. **处理**:返回的 `InputStream` 必须在外部使用后关闭(如通过 try-with-resources),否则会导致资源泄漏。在 `main` 方法中,我演示了如何保存文件。 3. **性能优化**: - 使用缓冲区(如 `byte[1024]`)提高读写效率。 - 设置合理的超时(`setConnectTimeout` 和 `setReadTimeout`),避免线程阻塞。 4. **错误处理**:添加更详细的日志或重试逻辑,以应对网络不稳定(引用[1]中使用了简单异常打印)。 5. **替代方法**: - **使用 RestTemplate(Spring 项目)**:简化代码,但需依赖 Spring 框架。引用[2]提到的方法示例: ```java RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> request = new HttpEntity<>(params, headers); ResponseEntity<byte[]> response = restTemplate.postForEntity(url, request, byte[].class); InputStream inputStream = new ByteArrayInputStream(response.getBody()); // 获取 ``` - **使用 Apache HttpClient**:更灵活,适合复杂场景(如多部分上传,参考引用[3])。 #### 引用说明 - 在连接配置和处理中,参考了 `HttpURLConnection` 的基础用法[^1]。 - 请求头设置借鉴了内容类型判断的通用实践[^3]。 - 文件读写优化了缓冲区管理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值