仅允许上传JPG/PNG/JPEG:PHP文件类型限制代码放置位置咨询
解决作品集编辑中的文件格式验证问题
我来帮你搞定这个文件格式限制的需求~ 正确的做法是在处理POST请求的初始阶段就添加格式验证(同时在函数里做二次验证增强安全性),这样能提前拦截不符合要求的文件,避免后续无效操作。
步骤1:在$_POST处理代码中添加格式验证逻辑
这是最关键的一步,我们要在接收上传文件后立刻检查格式是否合法,再执行后续的编辑操作。修改后的代码如下:
<?php if(isset($_POST['submit']) ){ $id = $connect->real_escape_string($_POST['id']); $name = $connect->real_escape_string($_POST['name']); $description =$connect->real_escape_string($_POST['description']); $image = $_FILES['image']; $tmp_file = $_FILES['image']['tmp_name']; $file_size= $_FILES['image']['size']; $type_file= $_FILES['image']['type']; // 定义允许的文件格式(扩展名和MIME类型双验证,更安全) $allowed_extensions = ['jpg', 'jpeg', 'png']; $allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg']; // 获取上传文件的扩展名(转成小写,避免大小写问题) $file_extension = strtolower(pathinfo($image['name'], PATHINFO_EXTENSION)); $is_valid_file = true; // 只有当用户上传了新文件时,才需要验证格式 if(!empty($image['name'])){ // 同时检查MIME类型和扩展名,防止恶意文件绕过验证 if(!in_array($type_file, $allowed_mime_types) || !in_array($file_extension, $allowed_extensions)){ $is_valid_file = false; } } // 如果文件格式不合法,直接返回错误提示 if(!$is_valid_file){ $type = "msg-fail"; $location = "mp_showdata.php"; $message = "仅允许上传JPG、PNG、JPEG格式的文件"; redirect($type,$location, $message); } else { // 格式合法,执行编辑操作 if(edit_portfolio($id, $name, $description, $image)) { $type = "msg-scs"; $location = "mp_showdata.php"; $message = "portfolio successfully edited"; redirect($type,$location, $message); }else{ $type = "msg-fail"; $location = "mp_showdata.php"; $message = "portfolio failed to edit"; redirect($type,$location, $message); } } } ?>
步骤2:修正edit_portfolio函数并添加二次验证
注意到你原来的函数定义里多了一个未传递的$type_file参数,先修正这个问题;同时为了安全性,在函数里再做一次格式验证(防止绕过前端/POST阶段的验证):
function edit_portfolio($id, $name, $description, $image){ global $connect; // 二次验证:再次检查文件格式,增强安全性 $allowed_extensions = ['jpg', 'jpeg', 'png']; $allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg']; if(!empty($image['name'])){ $file_extension = strtolower(pathinfo($image['name'], PATHINFO_EXTENSION)); if(!in_array($image['type'], $allowed_mime_types) || !in_array($file_extension, $allowed_extensions)){ return false; } } $filePath = "images/portfolios/".basename($image["name"]); // 小建议:检查目标路径是否存在,不存在则自动创建 if(!file_exists(dirname($filePath))){ mkdir(dirname($filePath), 0755, true); } move_uploaded_file($image["tmp_name"], $filePath); if(!empty($image['name'])){ $sql = "UPDATE ms_portfolios SET name='$name', description='$description', image='$filePath' WHERE id='$id'"; return $connect->query($sql) === TRUE; }else{ $sql = "UPDATE ms_portfolios SET name='$name', description='$description' WHERE id='$id'"; return $connect->query($sql) === TRUE; } } ?>
额外优化:前端添加格式过滤
虽然前端验证可以被绕过,但能提升用户体验,让用户在选择文件时就看到允许的格式:
<div class="form-group"> <label><?php echo "old image <span style=color:red>$row->image</span>" ?></label> <input type="file" name="image" accept="image/jpg, image/jpeg, image/png"> <input type="hidden" name="temp_img" value="<?php echo $row->image ?>"> <input type="hidden" name="id" value="<?php echo $row->id ?>"> </div>
这样修改后,就能确保只有JPG、PNG、JPEG格式的文件被允许上传啦~
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

