精华内容
下载资源
问答
  • SpringBoot 文件上传 基于MD5 文件内容校验工具类
    千次阅读
    2019-10-09 09:34:32

    1、业务场景:实现文件上传功能时。我们需要校验上传文件在传输过程中是否被注入脚本或者是被修改,所有采用md5 算法+ 文件内容生成一个识别码,传递给后端,让后端判断文件是否发生修改或变更。

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.file.Files;
    import java.nio.file.StandardOpenOption;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * 上传文件校验工具类
     * @author zzg
     *
     */
    public class UploadFileUtil {
    	// 密码提花
    	private static final char[] hexCode = "0123456789ABCDEF".toCharArray();
    	
    	// 文件类取MD5
        public static String calcMD5(File file){
            try (InputStream stream = Files.newInputStream(file.toPath(), StandardOpenOption.READ)) {
                return calcMD5(stream);
            }catch (IOException e) {
                e.printStackTrace();
                return "";
            }
        }
        // 输入流取MD5
        public static String calcMD5(InputStream stream) {
            try {
                MessageDigest digest = MessageDigest.getInstance("MD5");
                byte[] buf = new byte[8192];
                int len;
                while ((len = stream.read(buf)) > 0) {
                    digest.update(buf, 0, len);
                }
                return toHexString(digest.digest());
            } catch (IOException e) {
                e.printStackTrace();
                return "";
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                return "";
            }
        }
    
        public static String toHexString(byte[] data) {
            StringBuilder r = new StringBuilder(data.length * 2);
            for (byte b : data) {
                r.append(hexCode[(b >> 4) & 0xF]);
                r.append(hexCode[(b & 0xF)]);
            }
            return r.toString();
        }
    	
    }

     

    更多相关内容
  • 主要介绍了MVC文件上传支持批量上传拖拽及预览文件内容校验功能,需要的朋友可以参考下
  • 目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的...下面详细介绍C#之文件校验工具的开发及问题,需要的朋友可以参考下
  • 主要介绍了Java防止文件被篡改之文件校验功能,本文给大家分享了文件校验和原理及具体实现思路,需要的朋友可以参考下
  • 文件校验工具.exe

    2020-03-21 21:02:02
    到Maven仓库中找到疑似下载失败的jar包使用文件校验工具文件校验打开工具将要验证的jar包拖拽进工具界面比较SHA1值一致:确定jar包下载成功,内部正确没问题不一致:确定jar包内部损坏。
  • 主要介绍了C#计算文件MD5校验的方法,涉及C#针对文件进行md5校验的技巧,非常具有实用价值,需要的朋友可以参考下
  • 对于文件上传模块来说,尽量避免上传可执行的脚本文件,为了防止上传脚本需要设置对应的验证方式,使用白名单和黑名单进行文件校验,校验的时候不仅要校验文件的后缀名,还需要校验文件的真实类型。 1、基于白名单...

    文件上传的漏洞和防御-设置黑名单和白名单

    PHP脚本语言为例,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过Web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在远程服务器上执行任意PHP脚本。当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。

    1. 文件上传漏洞产生原因:

    ① 文件上传时检查不严:

    一些应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件。一些应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NCFiddler等断点上传工具轻松绕过客户端的检查。一些应用虽然在服务器端进行了黑名单检查,但是却可能忽略了大小写,如将.php改为.Php即可绕过检查;一些应用虽然在服务器端进行了白名单检查却忽略了%00截断符,如应用本来只允许上传jpg图片,那么可以构造文件名为xxx.php%00.jpg,其中%00为十六进制的0x00字符,.jpg骗过了应用的上传文件类型检测,但对于服务器来说,因为%00字符截断的关系,最终上传的文件变成了xxx.php

    ② 文件上传后修改文件名时处理不当:

    一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php

    对于文件上传模块来说,尽量避免上传可执行的脚本文件,为了防止上传脚本需要设置对应的验证方式,使用白名单和黑名单进行文件校验,校验的时候不仅要校验文件的后缀名,还需要校验文件的真实类型。

    1、基于白名单验证:允许上传的文件类型,只针对白名单中有的文件类型,文件才能上传成功。
    2、基于黑名单验证:不允许上传的文件类型,只针对黑名单中没有的文件类型,文件才能上传成功。

    2. 文件类型校验的方法

    假如文件上传类型的白名单为:[ jpeg, jpg, bmp, png, rtf, pdf, doc, docx]

    ① 第一步,校验文件后缀名:

    首先获取上传文件的后缀名,然后判断是否在白名单中,如果在就说明是允许上传的文件类型,否则就不允许上传。

    ② 第二步,校验文件真实类型:

    大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.pdf类型的文件我们就知道他是一个pdf文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,怎么识别一个文件的类型呢?这就用到了我们提到的“魔数”。很多类型的文件,其起始的几个字节的内容是固定的,这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。

    比如,java文件头魔数为CAFEBABE,可以通过这个魔数来识别class文件格式,所有的.class文件魔数都是CAFEBABE

    比如,应用只能上传.doc文件时,如果只判断文件后缀名还会引发文件漏洞问题,因为攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。所以需要根据文件头信息判断文件真实类型,假如用户上传的是.php文件,只是把后缀名改成了.doc文件,我们就可以根据文件魔数判断出用户上传的真实文件类型是.php文而不是.doc文件,从而禁止用户上传该文件。

    3. 本项目中遇到的问题

    项目中允许上传的文件类型白名单:[ jpeg, jpg, bmp, png, rtf, pdf, doc, docx, txt ] ,这个白名单的txt文件比较特殊,它没有固定的文件头魔数,就是说每个txt文件的文件头信息都不同,那么就没有办法根据文件头信息判断这个文件到底是不是txt文件,此时就需要用到文件上传类型黑名单,黑名单中是常见的可能会导致文件漏洞,木马,病毒的文件类型,当上传的txt文件的真实类型是这种文件时,需要禁止上传,但黑名单总归是不能预防所有安全问题的,所以直接禁止用户上传txt文件。

    方式1 :配置文件

    ① 定义允许上传的附件类型:

    attachment:
      file:
        maxSize: 10
        types:
          jpeg: FFD8FF
          jpg: FFD8FF
          bmp: 424D
          png: 89504E47
          rtf: 7B5C727466
          pdf: 255044462D312E
          doc: D0CF11E0
          docx: 504B030414
    

    ② 读取application.yml中的配置文件:

    @Data
    @ConfigurationProperties(prefix = "attachment.file")
    public class AttachmentFileConfig {
        private Double maxSize;
        private Map<String, String> types;
    }
    

    ③ 校验上传文件的类型,文件的大小,根据文件的头信息返回文件的真实类型

    public class AttachmentTypes {
    
        @Autowired
        private AttachmentFileConfig imageConfig;
    
        public AttachmentTypes(AttachmentFileConfig imageConfig) {
            this.imageConfig = imageConfig;
        }
    
        public String isValid(MultipartFile multipartFile) {
            Double maxSize = imageConfig.getMaxSize();
            // 校验上传文件的类型,文件的大小,根据文件的头信息返回文件的真实类型
            return FileUtils.checkFile(multipartFile, maxSize, imageConfig.getTypes());
        }
    }
    
    @Slf4j
    public class FileUtils {
        /**
         * 文件类型和文件大小校验
         * 
         * @param file            上传的附件
         * @param fileMaxSize     限制上传附件的大小
         * @param allowedFileType 限制上传附件的类型
         */
        public static String checkFile(MultipartFile file, Double fileMaxSize, Map<String, String> allowedFileType) {
            String fileType;
            // 文件类型判断 - 校验文件后缀
            String fileName = file.getOriginalFilename();
            if (StringUtils.isNotBlank(fileName)) {
                String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
                if (!fileTypeAllowed(suffix, allowedFileType.keySet())) {
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
            } else {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_FILENAME_NOT_ALLOWED);
            }
    
            // 文件类型判断 - 校验文件头内容
            try (InputStream inputStream = file.getInputStream()) {
                // 获取到上传文件的文件头信息
                String fileHeader = FileUtils.getFileHeader(inputStream);
                if (StringUtils.isBlank(fileHeader)) {
                    log.error("Failed to get file header content.");
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
                // 根据上传文件的文件头获取文件的真实类型
                fileType = getFileType(fileHeader,allowedFileType);
                if (StringUtils.isBlank(fileType) || !fileTypeAllowed(fileType, allowedFileType.keySet())) {
                    log.error("Unsupported file type: [{}]", fileType);
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
            } catch (IOException e) {
                log.error("Get file input stream failed.", e);
                throw new CommonException(BizCodeEnum.ATTACHMENT_UPLOAD_ERROR);
            }
    
            // 文件大小校验 - 单位:MB
            long fileBytes = file.getSize();
            double fileSize = (double) fileBytes / 1048576;
            if (fileSize <= 0) {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_EMPTY_FILE);
            } else if (fileSize > fileMaxSize) {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_EXCEED_LIMIT);
            }
            return fileType;
        }
    
        /**
         * 文件类型校验
         *
         * @param fileType    待校验的类型
         * @param allowedType 允许上传的文件类型
         * @return true - 满足,false - 不满足
         */
        private static boolean fileTypeAllowed(String fileType, Set<String> allowedType) {
            if (StringUtils.isBlank(fileType) || CollectionUtils.isEmpty(allowedType)) {
                return false;
            }
            return allowedType.contains(fileType);
        }
    
        /**
         * 据文件的头信息获取文件类型
         * 
         * @param fileHeader 文件头信息
         * @return 文件类型
         */
        public static String getFileType(String fileHeader,Map<String, String> allowedFileType) {
            if (fileHeader == null || fileHeader.length() == 0) {
                return null;
            }
            fileHeader = fileHeader.toUpperCase();
            Set<String> types = allowedFileType.keySet();
            for(String type:types){
                boolean b = fileHeader.startsWith(allowedFileType.get(type));
                if (b) {
                    return type;
                }
            }
            return null;
        }
    
        /**
         * 文件头字节数组转为十六进制编码
         *
         * @param content 文件头字节数据
         * @return 十六进制编码
         */
        private static String bytesToHexString(byte[] content) {
            StringBuilder builder = new StringBuilder();
            if (content == null || content.length <= 0) {
                return null;
            }
            String temp;
            for (byte b : content) {
                temp = Integer.toHexString(b & 0xFF).toUpperCase();
                if (temp.length() < 2) {
                    builder.append(0);
                }
                builder.append(temp);
            }
            return builder.toString();
        }
    
     /**
         * 获取文件的文件头信息
         * 
         * @param inputStream 输入流
         * @return 文件头信息
         * @throws IOException 异常
         */
        private static String getFileHeader(InputStream inputStream) throws IOException {
            byte[] content = new byte[28];
            inputStream.read(content, 0, content.length);
            return bytesToHexString(content);
        }
    }
    

    ④ Controller层:

    @Api("文档附件相关接口")
    @RestController
    @ResponseResult
    @RequestMapping("/api/v1")
    public class DocAttachmentController implements CommonConstant {
    
        @Autowired
        private DocAttachmentService docAttachmentService;
    
        @Autowired
        private AttachmentTypes attachmentTypes;
    
        @ApiOperation(value = "上传附件")
        @PostMapping("/attachments")
        public DocAttachment add(@Valid AttachmentAddReqVo attachmentAddReqVo) {
            MultipartFile file = attachmentAddReqVo.getMultipartFile();
            // 校验上传附件的类型和文件大小,并返回文件的真实类型
            String fileType = attachmentTypes.isValid(file);
            return docAttachmentService.save(new DocAttachment(attachmentAddReqVo, file, fileType), file);
        }
    }
    

    方式2 :枚举类

    ① 定义允许上传的附件类型

    @Getter
    public enum FileTypeEnum {
        /**
         * 允许上传的附件类型集合
         */
        JPEG("jpeg", "FFD8FF"),
        JPG("jpg", "FFD8FF"),
        PNG("png", "89504E47"),
        BMP("bmp", "424D"),
        RTF("rtf", "7B5C727466"),
        DOC("doc", "D0CF11E0"),
        DOCX("docx", "504B030414"),
        PDF("pdf", "255044462D312E");
    
        /**
         * 允许上传的文件类型的文件后缀
         */
        private final String suffixName;
    
        /**
         * 允许上传的文件类型的文件头信息
         */
        private final String headCode;
    
        /**
         * 构造方法
         * 
         * @param suffixName 文件后缀名
         * @param headCode   文件头信息
         */
        FileTypeEnum(String suffixName, String headCode) {
            this.suffixName = suffixName;
            this.headCode = headCode;
        }
    
        /**
         * 获取允许上传的文件类型集合
         * 
         * @return List-String
         */
        public static List<String> getFileType() {
            List<String> fileTypeList = new ArrayList<>();
            for (FileTypeEnum fileTypeEnum : FileTypeEnum.values()) {
                fileTypeList.add(fileTypeEnum.getSuffixName());
            }
            return fileTypeList;
        }
    }
    

    ② 校验文件类型:

    @Slf4j
    public class FileUtils {
        /**
         * 文件类型和文件大小校验
         * 
         * @param file            上传的附件
         * @param fileMaxSize     限制上传附件的大小
         * @param allowedFileType 限制上传附件的类型
         */
        public static String checkFile(MultipartFile file, Double fileMaxSize, Set<String> allowedFileType) {
            String fileType;
            // 文件类型判断 - 校验文件后缀
            String fileName = file.getOriginalFilename();
            if (StringUtils.isNotBlank(fileName)) {
                String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
                if (!fileTypeAllowed(suffix, allowedFileType)) {
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
            } else {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_FILENAME_NOT_ALLOWED);
            }
            // 文件类型判断 - 校验文件头内容
            try (InputStream inputStream = file.getInputStream()) {
                // 获取到上传文件的文件头信息
                String fileHeader = FileUtils.getFileHeader(inputStream);
                if (StringUtils.isBlank(fileHeader)) {
                    log.error("Failed to get file header content.");
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
                // 根据上传文件的文件头获取文件的真实类型
                fileType = getFileType(fileHeader);
                if (StringUtils.isBlank(fileType) || !fileTypeAllowed(fileType, allowedFileType)) {
                    log.error("Unsupported file type: [{}]", fileType);
                    throw new CommonException(BizCodeEnum.FILE_UPLOAD_TYPE_NOT_ALLOWED);
                }
            } catch (IOException e) {
                log.error("Get file input stream failed.", e);
                throw new CommonException(BizCodeEnum.ATTACHMENT_UPLOAD_ERROR);
            }
            // 文件大小校验 - 单位:MB
            long fileBytes = file.getSize();
            double fileSize = (double) fileBytes / 1048576;
            if (fileSize <= 0) {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_EMPTY_FILE);
            } else if (fileSize > fileMaxSize) {
                throw new CommonException(BizCodeEnum.FILE_UPLOAD_EXCEED_LIMIT);
            }
            return fileType;
        }
    
        /**
         * 文件类型校验
         *
         * @param fileType    待校验的类型
         * @param allowedType 允许上传的文件类型
         * @return true - 满足,false - 不满足
         */
        private static boolean fileTypeAllowed(String fileType, Set<String> allowedType) {
            if (StringUtils.isBlank(fileType) || CollectionUtils.isEmpty(allowedType)) {
                return false;
            }
            return allowedType.contains(fileType);
        }
    
        /**
         * 据文件的头信息获取文件类型
         * 
         * @param fileHeader 文件头信息
         * @return 文件类型
         */
        public static String getFileType(String fileHeader) {
            if (fileHeader == null || fileHeader.length() == 0) {
                return null;
            }
            fileHeader = fileHeader.toUpperCase();
            FileTypeEnum[] fileTypes = FileTypeEnum.values();
            for (FileTypeEnum type : fileTypes) {
                boolean b = fileHeader.startsWith(type.getHeadCode());
                if (b) {
                    return type.getSuffixName();
                }
            }
            return null;
        }
    
        /**
         * 文件头字节数组转为十六进制编码
         *
         * @param content 文件头字节数据
         * @return 十六进制编码
         */
        private static String bytesToHexString(byte[] content) {
            StringBuilder builder = new StringBuilder();
            if (content == null || content.length <= 0) {
                return null;
            }
            String temp;
            for (byte b : content) {
                temp = Integer.toHexString(b & 0xFF).toUpperCase();
                if (temp.length() < 2) {
                    builder.append(0);
                }
                builder.append(temp);
            }
            return builder.toString();
        }
        
       /**
         * 获取文件的文件头信息
         * 
         * @param inputStream 输入流
         * @return 文件头信息
         * @throws IOException 异常
         */
        private static String getFileHeader(InputStream inputStream) throws IOException {
            byte[] content = new byte[28];
            inputStream.read(content, 0, content.length);
            return bytesToHexString(content);
        }
    }
    
    展开全文
  • 文件校验工具.zip

    2018-06-28 13:42:42
    文件校验工具.zip文件校验工具.zip文件校验工具.zip文件校验工具.zip文件校验工具.zip
  • 由http://download.csdn.net/download/clk_esunny/9316547 的MD5文件校验改进,解除了计算完MD5校验值之后文件的锁定
  • 计算文件校验码: [root@linuxcool ~]# sum insert.sql 00827 12 与该功能相关的Linux命令:pssh命令 – 批量管理执行readlink命令 – 找出符号链接所指向的位置nl命令-添加行号bzmore命令 – 查看bzip2压缩过的...
  • 文件校验工具(File Checksum Tool)可以为每个文件生成MD5,SHA-1,HAVAL,MD2,SHA-256,SHA-384,SHA-512的校检码,用来查对哈希值,确保文件的安全性! 使用说明 哈希(校验码)是一种数字指纹,唯一地识别每个...
  • 压缩包中包含crc32文件校验的源码与demo程序.
  • Java实现MD5大文件校验码详细解析: 包括具体方法解释、注释 通俗易懂、易于理解
  • AntD框架选择上传文件校验信息使用场景解决思路注意事项实现代码后记 使用场景 使用a-upload提交文件时,往往会携带其他需要手动输入的信息,a-upload组件本身虽然提供了上传前校验的方法beforeUpload,但该方法是...

    AntD框架选择上传文件前校验信息

    使用场景

    使用a-upload提交文件时,往往会携带其他需要手动输入的信息,a-upload组件本身虽然提供了上传前校验的方法beforeUpload,但该方法是在选择文件后才会进行,这是官方文档的描述:

    上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传。支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传,resolve 时开始上传( resolve 传入 File 或 Blob 对象则上传 resolve 传入对象)。注意:IE9 不支持该方法。

    如果用户想要在选择上传文件之前校验(如input输入框的内容是否符合规则)则该方法无法支持

    解决思路

    用@change方法监控需要校验的内容,当内容不通过校验时上传按钮不启用,通过校验后点击上传按钮才可以上传文件

    注意事项

    onChange方法中不要使用vue的双向绑定获取校验内容,因为onChange触发时的实际内容为输入前的值,由此可见这样都比较不好,所以antd给你提供了e,目的就是想让你当前输入用e.target.value来获取 而不是用getFieldValue获取当前输入值。

    实现代码

    页面部分代码

    <a-form :form="excelform" autocomplete="off">
        <!-- 示例,上传文件前要校验姓名电话必须填写 -->
        <a-form-item :md="8" :sm="24" label="姓名">
            <a-input @change="checkUpload($event.target.value, 0)" :v-model="username" name="username" />
        </a-form-item>
        <a-form-item :md="8" :sm="24" label="电话">
            <a-input @change="checkUpload($event.target.value, 1)" :v-model="usertel" maxLength="11" name="usertel" />
        </a-form-item>
    </a-form>
    <!-- 未通过校验时,按钮点击功能为校验和提示,已通过校验是按钮功能为上传,使用同一个标志位来控制两个不同功能的按钮不会一起显示 -->
    <a-button v-show="!isUpload" type="primary" style="margin-bottom:10px;" @click="beforeUploadCheck">excel导入</a-button>
    <a-upload v-show="isUpload" accept=".xls,.xlsx" :showUploadList="false" :customRequest="selfUpload" :beforeUpload="beforeUpload" ref="upload">
        <a-button ref="beforeUpload" type="primary" style="margin-bottom:10px;">excel导入</a-button>
    </a-upload>
    

    onChange监听部分代码

    checkUpload(value, type) {
    	//由于运营商在不断申请新号段,实际项目中不建议将手机号校验做的太过细致
        var moblieCheck = /^1\d{10}$/;
        if(type == 1){
            if(this.username == null || this.username == ''){
                this.isUpload = false;
                return ;
            }
            if(!moblieCheck.test(value)){ //此处不要使用vue的双向绑定获取当前内容,使用@change传递的数据
                this.isUpload = false;
                return ;
            }
        }else{
            if(value == null || value == ''){  //此处不要使用vue的双向绑定获取当前内容,使用@change传递的数据
                this.isUpload = false;
                return ;
            }
            if(!moblieCheck.test(this.usertel)){
                this.isUpload = false;
                return ;
            }
        }
        this.isUpload = true;
    },
    

    校验和提示部分代码

    beforeUploadCheck(){
        if(this.username == null || this.username == ''){
            this.isUpload = false;
            this.$message.error('姓名必须填写');
            return ;
        }
        //由于运营商在不断申请新号段,实际项目中不建议将手机号校验做的太过细致
        var moblieCheck = /^1\d{10}$/;
        if(!moblieCheck.test(this.usertel)){
            this.isUpload = false;
            this.$message.error('电话号码格式不正确');
            return ;
        }
    }
    

    校验文件,这里是校验文件是excel

    beforeUpload(file) {
        const isExcel =
            file.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type == 'application/vnd.ms-excel';
        //此处需要特别注意,使用file.type进行校验是不可靠的,并非所有系统和浏览器都能获取file.type的信息,比如同为chrome,在mac环境是无法获取到file.type的
        var suffix = file.name.substr(file.name.lastIndexOf("."));
        if (!isExcel && (".xls" != suffix && ".xlsx" != suffix)) {
            this.$message.error('请上传excel文件');
        }
        const isLt2M = file.size / 1024 < 20000 && file.size / 1024 > 5;
        if (!isLt2M) {
            this.$message.error('文件大小应在10KB~20MB之间');
        }
        return isExcel && isLt2M;
    }
    

    上传文件方法

    selfUpload({ action, file, onSuccess, onError, onProgress }) {
        let formData = new FormData();
        formData.append('file', file);
        formData.append('username', this.username);
        formData.append('usertel', this.usertel);
        excelUpload(formData)  //上传文件的js,这里不放出了
            .then(res => {
                if (res == 200) {
                    this.$message.success('操作成功');
                }else{
                    this.$message.error('操作失败');
                }
            })
            .finally(() => {
                //处理无论成功失败必定进行的代码
            });
    }
    

    后记

    作为adnt框架的新手,在想到需要选择文件前进行校验的需求后查阅官方文档并没有得到满意的结果,于是自己想出了这么一个“偏门”的解决方案达到了近似的效果

    展开全文
  • 文件校验工具 MD5 校验王中文版文件校验工具 MD5 校验王中文版 MD5 校验王可以对任意文件进行版本,文件时间,MD5值,SHA1值,CRC32值的校验。 计算选项: 版本:当选择校验文件为exe或者dll文件时,在运算结果中...
  • matlab环境下的文件校验工具, 语法:File_verification_cmd(); 适用:放入工作路径,输入File_verification_cmd();,按照提示输入和选择文件即可。 原理:调用Windows的certutil -hashfile命令进行校验 功能: ...
  • md5sum命令 校验文件

    2021-01-20 15:00:30
    它会逐位对文件内容进行校验。是文件内容,与文件名无关,也就是文件内容相同,其md5值相同。 md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值。 语法格式:md5sum [参数] [文件] 常用...
  • Hash是一款小巧好用的哈希计算器,也是一款md5校验工具。支持文件拖放,速度很快,可以计算文件的 MD5、SHA1、CRC32 的值。
  • vc实现MD5文件校验

    2014-12-25 16:41:14
    拖放目标文件到对话框内,即可得到文件的md5值,单击生成校验按钮,就可为此文件生成一个.cyy后最的文件校验文件,下次拖拖放就该文件就可知道文件是否被修改过.(防止存储的文件被绑马而自己不知道)
  • 随着数字资源不断发展,面对大容量的数字资源校验时,现有的文件校验方法相比于传统文件校验在执行效率、服务器资源利用率方面已有极大的提高,但仍存在不灵活、服务器资源浪费、文件校验存在限制等特性.本文提出一...
  • 基于socket的文件传输并进行MD5值校验,供大家参考,具体内容如下 文件传输分为两个类,一个是服务端,一个是客户端。 客户端发起发送文件或接收文件的请求,服务端收到请求后接收或发送文件,最后进行MD5值的校验 ...
  • MimeType文件校验demo

    2015-08-20 11:30:01
    代码演示了几种获取MimeType类型的方法,包括jar包
  • 文件校验工具 CRC32 MD5 HASH校验码自动计算工具 可自动生成导入文件的以上校验码
  • EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库 demo
  • Hex文件校验生成和验证

    千次阅读 2021-08-18 00:21:44
    关注+星标公众号,不错过精彩内容编排| strongerHuang微信公众号 |嵌入式专栏手机升级系统,下载完系统都会存在一个校验过程:其实,在MCU升级过程中,也是需要校验hex文件...

    关注+星标公众,不错过精彩内容

    编排 | strongerHuang

    微信公众号 | 嵌入式专栏

    手机升级系统,下载完系统都会存在一个校验过程:

    其实,在MCU升级过程中,也是需要校验hex文件,如果要想升级更可靠,还可以在hex或bin升级文件后再增加校验信息。

    我们之前公司做的一个远程升级的产品,就是在升级文件之后增加了CRC16校验信息,在接收完整个升级文件之后,进行校验,这样做的目的就是使升级更可靠。

    今天来讲讲hex文件的校验和验证校验的内容。

    关于Hex

    hex 格式文件由 Intel 制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载到处理器里面的ASCII文本文件。

    1.解释

    维基百科解释

    https://en.wikipedia.org/wiki/Intel_HEX

    Intel HEX is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontrollers, EPROMs, and other types of programmable logic devices. In a typical application, a compiler or assembler converts a program's source code (such as in C or assembly language) to machine code and outputs it into a HEX file. The HEX file is then imported by a programmer to "burn" the machine code into a ROM, or is transferred to the target system for loading and execution.

    Keil官网解释

    https://www.keil.com/support/docs/1584/

    The Intel HEX file is an ASCII text file with lines of text that follow the Intel HEX file format. Each line in an Intel HEX file contains one HEX record. These records are made up of hexadecimal numbers that represent machine language code and/or constant data. Intel HEX files are often used to transfer the program and data that would be stored in a ROM or EPROM. Most EPROM programmers or emulators can use Intel HEX files.

    2.格式

    hex行格式:

    :BBAAAATT 【D···D】CC

    其中:

    代表行开始,固定为冒号:

    BB代表Bytes,数据长度

    AAAA代表Address,地址

    TT代表Type,数据类型(标识)

    D···D代表Date,数据

    CC代表CheckSum,校验和

    说明:

    BB数据长度,也就是D···D这个字段的数据长度;

    AAAA地址,起始地址、偏移地址,根据数据类型(TT)有关;

    TT数据类型(标识):

    • 00:数据标识

    • 01:文件结束标识

    • 02:扩展段地址

    • 04:线性地址

    • 05:线性开始地址

    (地址代表高16位地址,也就是要向左移16bit)

    CC校验和计算公式:

    CheckSum = 0x100 - (Sum & 0xFF)
    

    实例描述Hex

    下面通过一个例子来说明hex。

    说明一下:不同数据类型的数据略有差异,先再看下00(数据类型)的格式:

    一个常见hex文件:

    :020000040800F2
    :1000000000040020B1010008FD020008BD02000844
    :10001000F902000801020008350400080000000091
    :1000200000000000000000000000000021030008A4
    ···省略数行
    :100470000000024084040008000000200004000086
    :040480004804000824
    :040000050800019955
    :00000001FF
    

    1.04类型:线性地址行

    :020000040800F2
    

    02:数据长度,这里是(0800)地址的2字节长度;

    0000:偏移地址,这里数据其实无效;

    04:线性地址数据类型;

    0800:线性起始地址,左移16位,即:0x0800 0000;

    F2:校验和

    F2 =  0x100 - (0x02 + 0x04 + 0x08);

    比如,修改起始地址为0600:

    2.00类型:数据行

    :1000000000040020B1010008FD020008BD02000844
    

    10:数据长度,这里是16字节(程序)数据的长度;

    0000:偏移地址,数据第一行偏移0000地址,第二行就是偏移0010,第二行就是偏移0020,依次偏移到FFF0;

    如果偏移到FFF0,则会重新下一个起始地址,一段程序你就明白了:

    :10FFD000D0C5CFA20D0A00003052010810B50A4862
    :10FFE00002F0FEFC09A002F0FBFC14A002F0F8FCF9
    :10FFF0001EA221A123A002F0F3FC2CA002F0F0FC31
    :020000040801F1
    :10000000394802F0EDFC10BD3C5301080D0A2A20CE
    :1000100020202020202020202020202020202020E0
    :100020002020202020202020202020414756D6C7F5
    

    00:线性地址数据类型;

    00040020B1010008FD020008BD020008:程序数据,就是bin文件里面的纯程序数据;

    44:校验和

    44 =  0x100 - (0x10 + 0x04 + 0x20 + 0xB1 + 0x01 + 0x08 + 0xFD + 0x02 + 0x08 + 0xBD + 0x02 + 0x08 + 0x44) & 0xFF;

    3.01类型:文件结束行

    :00000001FF
    

    00:数据长度;

    0000:偏移地址,这里数据其实无效;

    01:代表文件结束

    FF:校验和

    这里代表hex文件结束了,有些公司为了使hex传输(下载)更可靠,或通过工具(或命令在)结束行后面追加校验信息,一般远程升级会考虑更多校验信息(后期抽时间讲述一下远程升级)。

    更多细节内容,可以参看链接:

    https://www.keil.com/support/docs/1584/

    https://www.kanda.com/blog/microcontrollers/intel-hex-files-explained/

    (公号不支持外链接,请复制链接到浏览器打开)

    看到这里,我相信很多人都能写一个脚本工具,让hex转为bin文件(后面抽空给大家讲述一下hex和bin转换的工具)。

    Hex校验测试代码

    Hex实际占用存储区大小计算办法:

    Hex实际大小=文件结束标志前面一条记录的存储起始地址+这条记录的有效数据长度。

    下面算法实现hex行的校验,校验成功返回1,失败返回0:

    bit AnalyseHEX(char hex[],int len)
    {
      unsigned char i=1;
      unsigned char data;
      int cc=0;
      char temp[2];
      do
      {
          temp[0] = hex[i++];
          temp[1] = hex[i++];
          sscanf(temp,"%x",&data);
          cc += data;
      } while (i<(len-2));
      cc%=256;
      cc=0x100-cc;
      temp[0] = hex[i++];
      temp[1] = hex[i++];
      sscanf(temp,"%x",&data);
      return (cc==data)?1:0;
    }
    

    当然,实现的算法可以各式各样,按照原理实现即可。

    更多关于升级文件的内容,可以参看文章:轻松理解bin、hex、axf和elf文件格式

    免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

    ------------ END ------------

    后台回复『文件格式』『科普知识』阅读更多相关文章。

    欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

    欢迎关注我的视频号:

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

    展开全文
  • Vue上传Excel文件校验Excel内容

    千次阅读 2019-03-29 14:16:09
    在近期开发的学校管理系统中,有一个导入管理模块,其中包含Excel的上传功能,由用户选择文件后进行上传,前端需要对文件内容进行初步校验后给出是否符合规范的提示后再传给后端。这就需要前端事先对Excel文件内容...
  • 深蓝文件MD5校验工具(md5校验工具)用于校验文件的MD5值是否相同,md5验证工具能够检查你从网上下载到的文件的完整性、和是否被篡改过。深蓝文件MD5校验工具更新:增加文件2路径添加
  • js 上传图片 校验 文件类型 大小js 上传图片 校验 文件类型 大小js 上传图片 校验 文件类型 大小 js 上传文件校验 js 上传文件校验 js 上传文件校验
  • JAVA对文件类型的校验

    千次阅读 2016-08-07 23:13:53
    第一步:编写一个枚举,在网上可以找到一些文件后缀所对应的前6位编码,例如JPEG对应的是FFD8FF   package com.ssh.pm_mark.core.test; public enum FileType { /** * JEPG. */ ...
  • 网页文件校验器 v1.0

    2019-11-06 06:36:31
    网页文件校验器,用于检查网站代码是否被修改或挂马,站长的安全小助手,本版为单机版,需要将网站代码下载到本地进行校验,校验文件时可灵活选择需要校验的文件类型。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 490,743
精华内容 196,297
关键字:

文件内容校验

友情链接: SDL2-2.0.5.tar.gz