Codeigniter do_upload() 在“成功”时静默失败

Posted

技术标签:

【中文标题】Codeigniter do_upload() 在“成功”时静默失败【英文标题】:Codeigniter do_upload() silently fails on "success" 【发布时间】:2011-09-20 01:27:11 【问题描述】:

我正在使用 CodeIgniter 编写图像上传表单。我以前有类似的代码可用于不同的站点。目前 - 接收多部分/表单数据图像的代码正在静默失败。在配置服务器/脚本时,我收到错误,例如文件路径不正确、mime 类型不正确,但现在我什么也没得到。

下面的代码返回:“ABC”,在“D”之前失败,没有错误。

如果我将“photo_filedata”更改为“photo_filedata2”,我会收到一个更有用的错误:“ABCD 您没有选择要上传的文件。”

我完全无法调试这个,因为我没有从服务器收到任何错误。

有人知道会发生什么吗?

服务器:WAMP,在 Windows 7 上运行。有一个可以毫无问题地上传文件的现有项目。

function upload_photo()

    echo "A";

    $config['upload_path'] = './images/uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['file_name'] = 'photo_' . substr(md5(time()), 0, 16);
    $config['max_size']    = 2000;
    $config['max_width']  = 0;
    $config['max_height']  = 0;

    echo "B";

    $this->load->library('upload', $config);

    echo "C";

    $result = $this->upload->do_upload('photo_filedata');

    echo "D";

    if (!$result)
    
        $error = $this->upload->display_errors();
        $data = false;
       
    else
    
        $error = false;
        $data = $this->upload->data();
    

    $this->load->view('home-photo-upload', array('error' => $error, 'data' => $data));

【问题讨论】:

@John Beech - 您能否在echo "C"; 下方直接添加ini_set('display_errors', true);error_reporting(E_ALL); 并告诉我们是否有任何显示? @Francois - 当然,现在将对其进行测试。我已经在另一个项目中使用了上面的代码,但是当我复制回来时,我遇到了同样的问题 - 所以它看起来可能是一个项目范围的配置问题。 @Francois - 仍然没有,永远不会进入“D”:` echo "C"; ini_set('display_errors', true);错误报告(E_ALL); $result = $this->upload->do_upload('photo_filedata');` echo "D";` @John Beech - 您确定该文件夹是可写的吗?我在 Linux 和 OSX 上使用 CodeIgniter,你的代码似乎可以工作。唯一想到的另一件事是路径应该使用 \ 而不是 /。 system/application/config/mimes.php 中有一个错字/错误导致 do_upload() 中的 is_allowed_filetype() 方法失败;错误:'gif' => array('image/gif', 'application/octet-stream'), 'jpeg' => array('image/jpeg', 'image/pjpeg', 'application/octet-stream' ), 'jpg' => array('image/jpeg', 'image/pjpeg', 'application/octet-stream'), 'jpe' => array('image/jpeg', 'image/pjpeg', ' application/octet-stream'), 'png' => array('image/png', 'image/x-png', 'application/octet-stream' ); // 缺少 ) 用于最终条目。 【参考方案1】:
$config['upload_path'] = 'uploads/category/'.$id.'/';
        //echo $file_name;die;
        //echo $config['upload_path'];
        $config['allowed_types'] = 'gif|jpg|jpeg|png';
        $config['max_size'] = '750';
        $config['max_width'] = '1920';
        $config['max_height'] = '1280';
        $this->load->library('upload');
         foreach ($_FILES as $key => $value) 
            //print_r($key);

            if (!empty($key['name'])) 

                $this->upload->initialize($config);
                if (!$this->upload->do_upload($key)) 
                  // echo 'test';die;
//                    rmdir('uploads/category/'.$id);
                    $errors = $this->upload->display_errors();
                    flashMsg($errors);
                


试试这个!

【讨论】:

【参考方案2】:

您将 maxwidth 和 maxheight 设置为零可能是问题所在。

【讨论】:

不,在原始代码中可以正常工作: // 其他项目的工作代码: $config['upload_path'] = './images/uploads/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = 1024 * 3; $config['max_width'] = 0; $config['max_height'] = 0;【参考方案3】:

(转自 cmets): system/application/config/mimes.php 中有一个错字/错误导致 is_allowed_filetype() 方法在 do_upload() 中失败;

Erronous: 
        ...
        'gif' => array('image/gif', 'application/octet-stream'),
        'jpeg' => array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
        'jpg' => array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
        'jpe' => array('image/jpeg', 'image/pjpeg', 'application/octet-stream'),
        'png' => array('image/png', 'image/x-png', 'application/octet-stream' 
    );

// missing ) 用于最终条目。 – John Beech(又名 Markavian)

CodeIgniter 配置文件中的任何错误似乎都会静默失败,因此不会报告任何进一步的错误。通过调试内部 CI 方法找到问题,找出哪条线路失败。

【讨论】:

以上是关于Codeigniter do_upload() 在“成功”时静默失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CodeIgniter 中上传图片?

codeigniter 3-您没有选择要上传的文件

Codeigniter上传库获取拇指文件名

致命错误:调用未定义的方法 Upload::do_upload()

ci上传图片

codeigniter 中是不是有子查询库?或者我如何在codeigniter 3中进行子查询?