驗證文件後綴

本文介绍两种使用JavaScript实现的文件后缀名验证方法,确保上传的文件类型符合预设的要求。第一种方法通过定义一个数组来存储允许的文件后缀名,并遍历检查;第二种方法提供了一个更通用的函数,可以根据传入的不同后缀数组进行验证。

//要驗證的後綴名

var exts = new Array("gif","jpg","swf");

var file1 = frm.file1.value;


方法一:

//獲取文件副檔名

function get_ext(f_path) {
var ext = "";
if (f_path != null && f_path.trim().length > 0) {
f_path = f_path.toLowerCase().trim();
ext = f_path.substring(f_path.lastIndexOf(".") + 1, f_path.length);
}
return ext;

}

if(file1 != ""){
var flag= false;
var ext = get_ext(file1);
for(var i=0;i<exts.length;i++){
if(exts[i] == ext){
flag= true;
}
}
if(!flag){
alert("只能上傳以gif,jpg,swf為後綴的附件檔案");
frm.file1.focus();
return false;
}
}

方法二:結合

/*
驗證文件副檔名
f_path 文件名 ,  accept_ext 副檔名數組
*/
function chk_ext(f_path, accept_ext){
    var ext = get_ext(f_path);
    //根據需求定制
//var accept_ext = new Array("png", "jpeg", "jpg", "gif");
var flag = false;
if (ext != "") {
for (var i = 0; i < accept_ext.length; i++) {
if (ext == accept_ext[i]) {
flag = true;
}
}
}
return flag;
}


<think>我们要求验证文件的后缀名(即文件类型)。通常,我们会获取文件的扩展名,然后检查它是否在允许的列表中。 在Web开发中,这通常用于文件上传验证。这里我们假设需要验证的文件名是一个字符串,我们从中提取后缀并与允许的后缀列表进行比较。 步骤: 1. 获取文件名,例如 "example.pdf" 2. 提取扩展名,即最后一个点后面的部分(注意:有些文件名可能包含多个点,如 "archive.tar.gz",但这里我们只考虑最后一个点之后的部分作为后缀?或者根据需求,有时我们需要考虑多个点的情况,但通常对于简单验证,我们取最后一个点之后的部分) 3. 将扩展名转换为小写(或大写)以便于比较(因为文件系统可能不区分大小写,但为了统一,我们通常进行大小写转换) 4. 检查扩展名是否在允许的列表中。 但是,注意:有些文件可能没有扩展名,或者文件名以点开头(如.htaccess),我们需要根据需求处理。 假设我们允许的文件类型列表:['pdf', 'doc', 'docx', 'jpg', 'png'] 我们写一个函数,传入文件名和允许的扩展名列表,返回布尔值。 注意:在提取扩展名时,如果文件名没有扩展名,我们可能返回空字符串。另外,我们也要考虑文件名有多个点的情况,比如“my.image.jpg”,那么扩展名应该是“jpg”。 另外,有些情况下,我们可能需要支持双扩展名,比如“tar.gz”,但这里我们只考虑简单情况,即只验证最后一个点后的部分。 如果需求是验证双扩展名,那么我们需要另外的方法。 我们先实现简单版本。 代码示例(Python):</think>### 文件类型(后缀验证实现 在 RuoYi 框架中验证文件类型(后缀)的核心思路是提取文件名的扩展名,并与允许的文件类型列表进行比对。以下是完整的实现方案: ```java import org.springframework.web.multipart.MultipartFile; import java.util.Arrays; import java.util.List; public class FileTypeValidator { // 允许的文件类型白名单 private static final List<String> ALLOWED_EXTENSIONS = Arrays.asList( "jpg", "jpeg", "png", "gif", "doc", "docx", "xls", "xlsx", "pdf" ); /** * 验证文件后缀是否合法 * @param file 上传的文件对象 * @return true-验证通过, false-验证失败 */ public static boolean validateFileType(MultipartFile file) { if (file == null || file.isEmpty()) { return false; } // 获取原始文件名 String originalFilename = file.getOriginalFilename(); if (originalFilename == null || originalFilename.lastIndexOf(".") == -1) { return false; // 无后缀名的文件 } // 提取文件后缀并转为小写 String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase(); // 检查是否在白名单中 return ALLOWED_EXTENSIONS.contains(extension); } } ``` ### 关键代码解释 1. **文件扩展名提取**: ```java String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase(); ``` - 使用 `lastIndexOf()` 确保正确处理多级扩展名(如 `file.tar.gz`) - `toLowerCase()` 统一大小写避免大小写敏感问题 2. **白名单验证**: ```java return ALLOWED_EXTENSIONS.contains(extension); ``` - 使用预定义的常量列表 `ALLOWED_EXTENSIONS` - 基于集合的查找效率高(O(1)时间复杂度) 3. **防御性检查**: ```java if (originalFilename == null || originalFilename.lastIndexOf(".") == -1) { return false; } ``` - 处理无后缀名文件 - 防止空指针异常 ### 实际应用示例(Spring Controller) ```java @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { if (!FileTypeValidator.validateFileType(file)) { return ResponseEntity.badRequest().body("文件类型不支持"); } // 处理合法文件... return ResponseEntity.ok("上传成功"); } ``` ### 安全增强建议 1. **配置文件化管理**: 将允许的扩展名移到配置文件中(如 `application.yml`): ```yaml ruoyi: allowed-file-types: - jpg - png - docx - pdf ``` 通过 `@Value` 注入: ```java @Value("${ruoyi.allowed-file-types}") private List<String> allowedTypes; ``` 2. **MIME类型双重验证**: ```java // 添加MIME类型验证 String mimeType = file.getContentType(); if (!ALLOWED_MIME_TYPES.contains(mimeType)) { return false; } ``` 3. **扩展名消毒处理**: ```java // 防止路径穿越攻击 String safeFileName = new File(originalFilename).getName(); ``` 4. **错误处理优化**: ```java // 返回详细的错误类型 public enum ValidationResult { EMPTY_FILE, INVALID_EXTENSION, NO_EXTENSION, VALID } ``` ### 扩展知识:常见文件类型特征 | 文件类型 | 扩展名 | MIME类型 | 文件头(HEX) | |----------|--------|----------|---------------| | JPEG | .jpg/.jpeg | image/jpeg | FF D8 FF E0 | | PNG | .png | image/png | 89 50 4E 47 | | PDF | .pdf | application/pdf | 25 50 44 46 | | ZIP | .zip | application/zip | 50 4B 03 04 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值