使用Codeigniter上传文件和创建上传文件夹


file uploading and creating upload folders with Codeigniter

我的Album_Model:中有这个函数

public function upload($album_id, $album){
        $album= strtolower($album);
        $upload_config = array(
            'upload_path'   =>  './uploads/'.$album,
            'allowed_types' =>  'jpg|jpeg|gif|png',
            'max_size'      =>  '2000',
            'max_width'     =>  '680',
            'max_height'    =>  '435', 
        );
        $this->load->library('upload', $upload_config);
        // create an album if not already exist in uploads dir
// wouldn't make more sence if this part is done if there are no errors and right before the upload ??
        if (!is_dir('uploads')) {
            mkdir('./uploads', 0777, true);
        }
        if (!is_dir('uploads/'.$album)) {
            mkdir('./uploads/'.$album, 0777, true);
        }
        if (!$this->upload->do_upload('imgfile')) { 
            // upload failed
            return array('error' => $this->upload->display_errors('<span>', '</span>'));
        } else {
            // upload success
            $upload_data = $this->upload->data();
            return true;
        }
    }

因此,它的基本功能是将图像上传到相册中。此外,如果文件夹相册不存在,则会创建一个新相册。

我做了一些测试,发现了一些可能是小错误的东西。当我强迫我的表单进行一些无效的上传尝试时,上传失败了,正如预期的那样,但相册文件夹(假设相册文件夹不存在)仍然被创建。

如果没有错误,谁能在上传图像之前创建相册文件夹呢?如果是,我该如何解决??

您已经设置了一个用于检查目录是否存在的标志。我已经更改了您的代码,使其能够根据您的需要工作。

<?php
public function upload($album_id, $album)
{
    $album = strtolower($album);
    $upload_config = array('upload_path' => './uploads/' . $album, 'allowed_types' =>
        'jpg|jpeg|gif|png', 'max_size' => '2000', 'max_width' => '680', 'max_height' =>
        '435', );
    $this->load->library('upload', $upload_config);
    // create an album if not already exist in uploads dir
    // wouldn't make more sence if this part is done if there are no errors and right before the upload ??
    if (!is_dir('uploads'))
    {
        mkdir('./uploads', 0777, true);
    }
    $dir_exist = true; // flag for checking the directory exist or not
    if (!is_dir('uploads/' . $album))
    {
        mkdir('./uploads/' . $album, 0777, true);
        $dir_exist = false; // dir not exist
    }
    else{
    }
    if (!$this->upload->do_upload('imgfile'))
    {
        // upload failed
        //delete dir if not exist before upload
        if(!$dir_exist)
          rmdir('./uploads/' . $album);
        return array('error' => $this->upload->display_errors('<span>', '</span>'));
    } else
    {
        // upload success
        $upload_data = $this->upload->data();
        return true;
    }
}
?>

接受的答案不是正确的方式

正确的方法是扩展Upload库

代码:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * File Uploading Class Extension
 *
 * @package     CodeIgniter
 * @subpackage  Libraries
 * @category    Uploads
 * @author      Harrison Emmanuel (Eharry.me)
 * @link        https://www.eharry.me/blog/post/my-codeigniter-upload-extension/
 */
class MY_Upload extends CI_Upload {
    /**
     * Validate Upload Path
     *
     * Verifies that it is a valid upload path with proper permissions.
     *
     * @return  bool
     */
    public function validate_upload_path()
    {
        if ($this->upload_path === '')
        {
            $this->set_error('upload_no_filepath', 'error');
            return FALSE;
        }
        if (realpath($this->upload_path) !== FALSE)
        {
            $this->upload_path = str_replace('''', '/', realpath($this->upload_path));
        }
        if ( ! is_dir($this->upload_path))
        {
            // EDIT: make directory and try again
            if ( ! mkdir ($this->upload_path, 0777, TRUE))
            {
                $this->set_error('upload_no_filepath', 'error');
                return FALSE;
            }
        }
        if ( ! is_really_writable($this->upload_path))
        {
            // EDIT: change directory mode
            if ( ! chmod($this->upload_path, 0777))
            {
                $this->set_error('upload_not_writable', 'error');
                return FALSE;
            }
        }
        $this->upload_path = preg_replace('/(.+?)'/*$/', '''1/',  $this->upload_path);
        return TRUE;
    }
}


如何使用:

只需创建application/libraries/MY_Upload.php并将上面的代码粘贴到其中即可。仅此而已!


更多信息:

  • GitHub Gist
  • 我在Eharry.me上的博客文章


注意:

此扩展与CodeIgniter3.x和2.x版本兼容。

如果它不存在,那么它将始终成为目录。

回答你的问题。。是的,在上传之前创建文件夹会更有意义。

试着放这个:

if (!is_dir('uploads')) {
    mkdir('./uploads', 0777, true);
        }
if (!is_dir('uploads/'.$album)) {
    mkdir('./uploads/'.$album, 0777, true);
        }

内部:

if (!$this->upload->do_upload('imgfile')) { 
        // upload failed
        return array('error' => $this->upload->display_errors('<span>', '</span>'));
    } else {
        // put if statements here.
        // upload success
        $upload_data = $this->upload->data();
        return true;
    }

所以它看起来是这样的:

if (!$this->upload->do_upload('imgfile')) { 
        // upload failed
        return array('error' => $this->upload->display_errors('<span>', '</span>'));
    } else {
        if (!is_dir('uploads')) {
        mkdir('./uploads', 0777, true);
    }
    if (!is_dir('uploads/'.$album)) {
        mkdir('./uploads/'.$album, 0777, true);
    }
        // upload success
        $upload_data = $this->upload->data();
        return true;
    }

如果我理解正确的话,这应该是你想要的。

希望能有所帮助。