美文网首页
各种文件请求头信息

各种文件请求头信息

作者: Mark_ZSQ | 来源:发表于2020-01-06 16:11 被阅读0次

https://blog.csdn.net/adsadadaddadasda/article/details/83047344

package com.example.test;

import org.junit.Test;
import java.io.File;

/**
 * @ClassName TestFileFormatVerify
 * @Description 测试FileFormatVerify类
 * @Author sun
 * Date 2019/5/8 14:57
 * @Version 1.0
 **/
public class TestFileFormatVerify {

    /**
     * @Description 测试传入参数后缀是否有篡改
     * @Param []
     * @return void
     **/
    @Test
    public void TestSuffixReg(){
        FileFormatVerify reg = new FileFormatVerify();
        File file = new File("E:\\ideaFile\\RegEx\\src\\1.xlsx");

        if (file.isFile() && file.exists()){

            boolean b = reg.suffixVerify(file);
            System.out.println(b);

        }

    }

    /**

     * @Description 查看传入文件格式的前几位字符
     * @Param []
     * @return void
     **/
    @Test
    public void CheckFileByte8(){
        FileFormatVerify reg = new FileFormatVerify();
        File file = new File("E:\\ideaFile\\RegEx\\src\\1.xlsx");

        byte[] bytes = reg.inputStream2ByteArray(file);
        String s = reg.bytesToHexString(bytes);
        System.out.println(s);
    }
}
package com.example.test;

import java.io.*;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName FileFormatVerify
 * @Description 图片 pdf/wored/excel和各种压缩格式的校验
 **/
public class FileFormatVerify {

    private static Map<String, Object> fileFormat = null;
    //允许上传的文件类型
    private String fileTypeAll = "mp3,mp4,video,rmvb,pdf,txt,xml,doc,gif,png,bmp,jpeg";
    //允许上传的文件最大大小(100M,单位为byte)
    private Long maxSize = Long.parseLong(String.valueOf(1024 * 1024 * 100));

    /**
     * @return
     * @Description 将常用需要校验的格式和区别其他格式的前几个字节写入map
     * @Param []
     **/
    public FileFormatVerify() {
        fileFormat = new HashMap<String, Object>();

        //JPEG
        fileFormat.put("jpg", "FFD8FFE0");
        //PNG
        fileFormat.put("png", "89504E47");
        fileFormat.put("zip", "504B0304");
        fileFormat.put("rar", "52617221");
        /**
         * docx ,xlsx和zip   相同  doc 和 xls 相同
         */
        fileFormat.put("docx", "504b0304");
        fileFormat.put("doc", "d0cf11e0");

        fileFormat.put("xls", "d0cf11e0");
        fileFormat.put("xlsx", "504b0304");
        //fileFormat.put("pdf","255044462D312E");
        fileFormat.put("pdf", "255044462");
    }

    /**
     * @return boolean 返回true 表示文件格式验证通过, 返回false 文件格式验证失败
     * @Description 根据传入的文件获得后缀, 获得指定文件格式byte[]数组中的前8位字符
     * 将传入文件转化为byte[]数组,取前8位.判断传入文件的前8位和我们指定好的文件byte[]的前8位是否相同,
     * 如果相同则文件格式没有被篡改,反之,文件后缀格式被篡改
     * @Param [file]
     **/
    public boolean suffixVerify(File file) {
        String fileType = "";
        String name = file.getName();
        int i = name.lastIndexOf(".");
        // 获取文件的后缀
        if (i > 0) {
            fileType = name.substring(i + 1);
        }
        //根据文件的后缀获取,获取文件的byte[]的前8位
        if (fileFormat.containsKey(fileType.toLowerCase())) {
            String fileByte8 = String.valueOf(fileFormat.get(fileType.toLowerCase()));
            //获取传入文件的byte[]的前8位
            byte[] bytes = inputStream2ByteArray(file);
            String compareByte = bytesToHexString(bytes);
            //如果传入文件的byte[]的前8位和我们定义好的byte[]的前8位相同,验证通过.
            if (compareByte.startsWith(fileByte8)) {
                //如果格式校验成功
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }


    /**
     * @return byte[]
     * @Description 将file文件转化为byte[]
     * @Param [file]
     **/
    public byte[] inputStream2ByteArray(File file) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        FileInputStream fis = null;
        byte[] buffer = null;

        try {
            fis = new FileInputStream(file);
            //不用读取全部文件,只读文件前面的部分
            byte[] b = new byte[1024];
            fis.read(b);
            bos.write(b, 0, 1024);

            /**
             byte[] b = new byte[4];
             int n;
             while ((n = fis.read(b)) != -1){
             bos.write(b, 0, n);
             }
             */
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (bos != null) {
                    bos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return buffer;
    }


    /**
     * @return java.lang.String
     * @Description 取byte[]前8位的为字符串
     * @Param [src]
     **/
    public 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().substring(0, 8);
        return stringBuilder.toString();
    }


    /**
     * 根据java.nio.*的流获取文件大小
     *
     * @param file
     */
    public Long getFileSize(File file) {
        FileChannel fc = null;
        Long size = null;
        try {
            if (file.exists() && file.isFile()) {
                String fileName = file.getName();
                FileInputStream fis = new FileInputStream(file);
                fc = fis.getChannel();
                System.out.println("文件" + fileName + "的大小是:" + fc.size() + "\n");
                size = fc.size();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != fc) {
                try {
                    fc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return size;
    }


    /**
     * 校验文件格式是否支持和大小是否符合检验
     * @param file
     * @return true 符合
     */
    public boolean check(File file) {
        boolean flag = false;
        String fileType = "";
        String name = file.getName();
        //judge file type
        if ( Arrays.asList(fileType.split(",")).contains(name)){
            int i = name.lastIndexOf(".");
            // 获取文件的后缀
            if (i > 0) {
                fileType = name.substring(i + 1);
            }
            //根据文件的后缀获取,获取文件的byte[]的前8位
            if (fileFormat.containsKey(fileType.toLowerCase())) {
                String fileByte8 = String.valueOf(fileFormat.get(fileType.toLowerCase()));
                //获取传入文件的byte[]的前8位
                byte[] bytes = inputStream2ByteArray(file);
                String compareByte = bytesToHexString(bytes);
                Long size = getFileSize(file);
                //如果传入文件的byte[]的前8位和我们定义好的byte[]的前8位相同,验证通过.
                if (compareByte.startsWith(fileByte8) && maxSize > size) {
                    //如果格式校验成功
                    flag = true;
                }
            }
        }
        return flag;
    }

    public void fileToMultipartFile() {

    }

}



相关文章

网友评论

      本文标题:各种文件请求头信息

      本文链接:https://www.haomeiwen.com/subject/xcukactx.html