CoreJava Java基本数据类型 个人收款码 centos7 哨兵模式 CK ISP dictionary ros 打印 scripting Normalizecss 后台管理系统模板 string转16进制 查看mysql是否启动 ubuntu更改文件夹权限 vue使用bootstrap matlab取绝对值 python学习 安装mysql python代码示例 python获取数据类型 python中的for循环 python入门指南 python编程工具 python函数返回 python调用命令行 python读取字典 java发邮件 java初级 怎么看java版本 java输出当前时间 java日期格式 linuxshell编程 源计划卡特 cmd代码 spoonwep ram容量是什么意思 assist是什么意思 蓝牙测试软件 惠普战99
当前位置: 首页 > 学习教程  > 编程语言

个人使用向1:文件上传的类型限制思考

2020/12/5 10:42:06 文章标签:

数据 通过输入输出来进行交互,对应数据最后保存到数据库中。那么对应文件,excel跟图片就没办法都放在数据库。当然图片可以通过BASE64也能进数据库,只是没有那么适用性。 目前文件上传一般是分二种,1.上传七牛云, 阿里的OSS都是不…

数据 通过输入输出来进行交互,对应数据最后保存到数据库中。那么对应文件,excel跟图片就没办法都放在数据库。当然图片可以通过BASE64也能进数据库,只是没有那么适用性。

目前文件上传一般是分二种,1.上传七牛云, 阿里的OSS都是不错的文件存储云服务器。动动你的小手,然后联调上对应接口,就能把你的文件上传到网络上,but 要钱。2.本地存储是初入以及一些感觉隐秘性高以及不想在文件存储上有很大开销会选择的。

那么文件上传本地,本身也意味着你本地需要暴露给其他服务器,让他们好发送文件给你服务器。所以这里需要注意一些文件上传控制的东西。防止木马到你的服务器,给你留下悔恨的泪水。

1.服务器本身自带的白名单,黑名单。来防止你不欢迎的服务器还能强行塞东西给你。

2.部分服务器有nginx,本身也有简单对于文件大小的限制。需要注意一下,如果你文件过大,可能在这一层就被拦截了。如果有大文件需求,需要适当调节nginx放行文件的大小。

3.通过文件后缀。对应文件text跟html,js之类的,进行特定的文件后缀黑名单,白名单。对应正常后缀给白名单,其余的一律黑名单,宁杀错不放过。不过这个很容易被欺骗,别人可以通过改后缀进行上传危险文件。

4.通过Content-Type 判断

这个是通过判断文件的MIME类型进行判断,我们在通过form表单上传文件时,在上传的request域里面会获取当前文件的MIME类型,我们可以通过控制接收文件的MIME类型进行判断。spring为我们提供了注解方式进行判断

@RequestMapping(value = "/users", method = RequestMethod.POST, consumes="application/json", produces="application/json")

consumes参数就是用来控制接收文件的Content-Type的。

5.重头来了。 通过文件流判断文件头。

具体代码如下:

(1) 获取文件头代码

 /** 
 * 将文件头转换成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();  
}

(2)调用对应方法

InputStream inputStream = new FileInputStream("path");
byte[] bytes = new byte[6];
inputStream.read(bytes,0,bytes.length);
bytesToHexString(bytes);

(3).获取文件头与指定文件头进行对比

比如

/** 
         * 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. 
     */  
    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(InputStream is) throws IOException {  
  
    byte[] b = new byte[28];  
  
    InputStream inputStream = null;  
  
    try {  
        is.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(InputStream is) throws IOException {  
  
    String fileHead = getFileContent(is);  
    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;  
}  
/**
 * 
 * @param value 表示文件类型
 * @return 1 表示图片,2 表示文档,3 表示视频,4 表示种子,5 表示音乐,6 表示其它
 * @return
 */
public static Integer isFileType(FileType value) {  
    Integer type = 6;// 其他  
    // 图片  
    FileType[] pics = { FileType.JPEG, FileType.PNG, FileType.GIF, FileType.TIFF, FileType.BMP, FileType.DWG, FileType.PSD };  
  
    FileType[] docs = { FileType.RTF, FileType.XML, FileType.HTML, FileType.CSS, FileType.JS, FileType.EML, FileType.DBX, FileType.PST, FileType.XLS_DOC, FileType.XLSX_DOCX, FileType.VSD,  
            FileType.MDB, FileType.WPS, FileType.WPD, FileType.EPS, FileType.PDF, FileType.QDF, FileType.PWL, FileType.ZIP, FileType.RAR, FileType.JSP, FileType.JAVA, FileType.CLASS,  
            FileType.JAR, FileType.MF, FileType.EXE, FileType.CHM };  
  
    FileType[] videos = { FileType.AVI, FileType.RAM, FileType.RM, FileType.MPG, FileType.MOV, FileType.ASF, FileType.MP4, FileType.FLV, FileType.MID };  
  
    FileType[] tottents = { FileType.TORRENT };  
  
    FileType[] audios = { FileType.WAV, FileType.MP3 };  
  
    FileType[] others = {};  
  
    // 图片  
    for (FileType fileType : pics) {  
        if (fileType.equals(value)) {  
            type = 1;  
        }  
    }  
    // 文档  
    for (FileType fileType : docs) {  
        if (fileType.equals(value)) {  
            type = 2;  
        }  
    }  
    // 视频  
    for (FileType fileType : videos) {  
        if (fileType.equals(value)) {  
            type = 3;  
        }  
    }  
    // 种子  
    for (FileType fileType : tottents) {  
        if (fileType.equals(value)) {  
            type = 4;  
        }  
    }  
    // 音乐  
    for (FileType fileType : audios) {  
        if (fileType.equals(value)) {  
            type = 5;  
        }  
    }  
    return type;  
}  
  
public static void main(String args[]) throws Exception {  
     System.out.println(
             FileTypeJudge.isFileType(
                     FileTypeJudge.getType(
                             new FileInputStream(
                                     new File("C:\\Users\\ituser1\\Desktop\\123.pptx")))));
    for (FileType type : FileType.values()) {  
        System.out.print(type + "\t");  
    }  
}  
}

对应代码复制 注意大括号访问。cv战士也需要理解之后,再使用。


漫漫长路,一个小周跟他一个小陈朋友一起努力奔跑。



本文链接: http://www.dtmao.cc/news_show_450300.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?