You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]',

排查与解决步骤

  1. 补充验证失败的错误输出
    当前代码中,若验证不通过($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);
        }
    }
    
  2. 检查服务器上传大小限制
    视频文件通常体积较大,需确认php.ini中的以下配置是否足够:

    • upload_max_filesize:单个上传文件的最大限制,建议设置为大于视频文件的大小(比如200M)
    • post_max_size:POST请求的总数据大小,需大于upload_max_filesize
      修改后需重启服务器生效。
  3. 替换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]',
    
  4. 完善Ajax错误处理
    当前Ajax仅处理success场景,需添加error回调捕获网络错误、后端500错误等情况:

    error: function(xhr, status, error) {
        console.log("请求状态:", status);
        console.log("后端响应:", xhr.responseText);
        alert("上传请求出错:" + error);
    }
    
  5. 检查文件夹权限与文件名逻辑

    • 确认Vedio/文件夹具备服务器用户的写入权限(通常设置为755或775)
    • 代码中强制给文件添加.mp4后缀,若上传的是其他格式(即使验证通过)可能引发问题,建议保留原扩展名:
      $fileName = rand(10005, 100005) . time() . "." . $imageFile->getClientExtension();
      

内容的提问来源于stack exchange,提问作者FREE SPEED

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:25:38