CodeIgniter视频上传失败求助:图片可正常上传视频无法上传
问题:CodeIgniter框架中图片上传正常,视频上传失败无任何报错提示
在CodeIgniter项目中,图片文件可正常完成上传,但上传MP4视频文件时完全失败,且没有任何错误提示。已尝试移除验证规则中的图片MIME类型,仅保留video/mp4,问题仍未解决。
相关代码
HTML及JS代码
<div class="row mb-5"> <div class="col-md-12"> <input type="file" name="slider_image" id="" class="form-control mb-5" onchange="homeSliderUpload(this)"> <div class="progress mb-5" style="--sa-progress--value: 0%"> <div class="progress-bar progress-bar-sa-primary" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"> </div> </div> </div> </div> </div> </div> </div> <script> function homeSliderUpload(form) { alert("First"); var file_data = $("input[name='slider_image']").prop('files')[0]; var form_data = new FormData(); form_data.append('file', file_data); $.ajax({ url: "<?php echo base_url(); ?>/Path/VedioUploader", dataType: 'text', method: "post", cache: false, contentType: false, processData: false, data: form_data, success: function(data) { var rJson = $.parseJSON(data); if (rJson.status == true) { $(" .progress").attr("style", "--sa-progress--value: 100%"); $("input[name='slider_image']").val(''); setInterval(() => { location.reload(); }, 1000); } else { alert("Error"); } } }); } </script>
PHP处理代码(Ajax接口)
public function VedioUploader() { $validateImage = $this->validate([ 'file' => [ 'uploaded[file]', 'mime_in[file, video/mp4, image/png, image/jpg,image/jpeg, image/gif]', 'max_size[file, 1000000000]', ], ]); if ($validateImage) { $imageFile = $this->request->getFile('file'); $folder = "Vedio/"; $fileName = rand(10005, 100005) . time() . ".mp4"; $imageFile->move($folder, $fileName); $data = [ 'img_name' => $imageFile->getClientName(), 'file' => $imageFile->getClientMimeType(), 'type' => $imageFile->getClientExtension(), ]; if ($fileName) { $homeSliderModel = new VedioUplaod(); $home_slider["slider_file_url"] = $folder . "/" . $fileName; $home_slider["slider_show"] = 1; $home_slider["slider_order"] = 0; $homeSliderModel->insert($home_slider); if (!$homeSliderModel->errors()) { echo json_encode([ "status" => true, "slider_id" => $homeSliderModel->getInsertID(), "file_url" => $folder . "/" . $fileName, "order" => 0 ]); } } } }
尝试修改后的验证规则(仅保留MP4)
'mime_in[file, video/mp4]',
排查与解决步骤
补充验证失败的错误输出
当前代码中,若验证不通过($validateImage为false),后端没有返回任何JSON数据,前端Ajax的success回调尝试解析空内容会直接失败,且不会触发Error分支。需在验证失败时输出错误信息:} else { echo json_encode([ "status" => false, "errors" => $this->validator->getErrors() ]); exit; }同时在前端
success中增加异常捕获,避免解析失败:success: function(data) { try { var rJson = $.parseJSON(data); if (rJson.status == true) { // 成功逻辑 } else { alert("上传失败:" + JSON.stringify(rJson.errors)); } } catch(e) { alert("返回数据解析错误:" + e.message); console.log("后端返回原始内容:", data); } }检查服务器上传大小限制
视频文件通常体积较大,需确认php.ini中的以下配置是否足够:upload_max_filesize:单个上传文件的最大限制,建议设置为大于视频文件的大小(比如200M)post_max_size:POST请求的总数据大小,需大于upload_max_filesize
修改后需重启服务器生效。
替换MIME验证为扩展名验证(或双重验证)
部分MP4文件的MIME类型可能被浏览器或服务器识别为video/mpeg等其他值,导致mime_in验证失败。建议改用ext_in验证文件扩展名:'ext_in[file, mp4,png,jpg,jpeg,gif]',也可同时保留MIME和扩展名验证,提高兼容性:
'mime_in[file, video/mp4, video/mpeg, image/png, image/jpg,image/jpeg, image/gif]', 'ext_in[file, mp4,png,jpg,jpeg,gif]',完善Ajax错误处理
当前Ajax仅处理success场景,需添加error回调捕获网络错误、后端500错误等情况:error: function(xhr, status, error) { console.log("请求状态:", status); console.log("后端响应:", xhr.responseText); alert("上传请求出错:" + error); }检查文件夹权限与文件名逻辑
- 确认
Vedio/文件夹具备服务器用户的写入权限(通常设置为755或775) - 代码中强制给文件添加
.mp4后缀,若上传的是其他格式(即使验证通过)可能引发问题,建议保留原扩展名:$fileName = rand(10005, 100005) . time() . "." . $imageFile->getClientExtension();
- 确认
内容的提问来源于stack exchange,提问作者FREE SPEED
相关产品推荐
相关产品推荐

