Java上传文件获取文件类型

在Java开发中,经常会遇到需要上传文件的场景,比如用户上传头像、上传附件等。在处理这些上传文件的过程中,我们通常需要获取文件的类型,以便进行后续的处理。本文将为您介绍在Java中如何通过上传文件获取文件类型的方法。

1. 通过文件名获取文件类型

在某些情况下,我们可以通过文件名的后缀来获取文件的类型。Java提供了File类来操作文件,我们可以使用getName()方法获取文件名,并通过substring()方法获取文件名的后缀。然后根据后缀判断文件类型。

import java.io.File;

public class FileTypeUtil {

    public static String getFileTypeByFileName(String fileName) {
        String fileType = "";
        if (fileName != null) {
            int dotIndex = fileName.lastIndexOf(".");
            if (dotIndex >= 0 && dotIndex < fileName.length() - 1) {
                fileType = fileName.substring(dotIndex + 1).toLowerCase();
            }
        }
        return fileType;
    }
    
    public static void main(String[] args) {
        String fileName = "example.jpg";
        String fileType = getFileTypeByFileName(fileName);
        System.out.println("File type: " + fileType);
    }
}

上述代码中,getFileTypeByFileName()方法接受一个文件名作为参数,并通过lastIndexOf()方法找到文件名中最后一个.的位置,然后使用substring()方法截取后缀并转为小写字母。在main()方法中,我们测试了一个名为example.jpg的文件,输出结果为jpg

2. 通过文件头获取文件类型

在某些情况下,文件名的后缀并不能完全确定文件的类型,因为有些文件可能被修改过后缀名。此时,我们可以通过文件头的信息来判断文件的类型。文件头是文件内容中的前几个字节,通常包含了文件的一些标识信息。我们可以读取文件的前几个字节,并根据文件头来判断文件类型。

import java.io.FileInputStream;
import java.io.IOException;

public class FileTypeUtil {

    public static String getFileTypeByFileHeader(String filePath) {
        String fileType = "";
        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] fileHeader = new byte[8];
            fis.read(fileHeader, 0, 8);
            fileType = getFileTypeByFileHeader(fileHeader);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileType;
    }

    private static String getFileTypeByFileHeader(byte[] fileHeader) {
        String[] fileTypes = {"jpg", "png", "gif"};
        String[] fileHeaders = {"FFD8FF", "89504E47", "47494638"};
        String fileType = "";
        for (int i = 0; i < fileHeaders.length; i++) {
            if (bytesToHexString(fileHeader).startsWith(fileHeaders[i])) {
                fileType = fileTypes[i];
                break;
            }
        }
        return fileType;
    }

    private static String bytesToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        for (byte b : bytes) {
            int value = b & 0xFF;
            String hexString = Integer.toHexString(value);
            if (hexString.length() < 2) {
                sb.append(0);
            }
            sb.append(hexString);
        }
        return sb.toString().toUpperCase();
    }

    public static void main(String[] args) {
        String filePath = "example.jpg";
        String fileType = getFileTypeByFileHeader(filePath);
        System.out.println("File type: " + fileType);
    }
}

上述代码中,getFileTypeByFileHeader()方法接受一个文件路径作为参数,通过FileInputStream读取文件的前8个字节,然后调用getFileTypeByFileHeader()方法根据文件头判断文件类型。getFileTypeByFileHeader()方法使用了一个fileHeaders数组来存放不同文件类型的文件头信息,同时也使用了一个fileTypes数组来存放对应的文件类型。bytesToHexString()方法将字节数组转为16进制字符串。

总结

本文介绍了通过文件名和文件头获取文件类型的方法。通过文件名获取文件类型的方式简单直接,但并不准确;而通过文件头获取文件类型的方式更准确,但相对复杂。在实际开发中,可以根据具体需求选择合适的方法。