Henrique Barone
Henrique Barone

Reputation: 153

Code igniter file upload and file write

I try to write code on page using with file uploader. The page generated must have the css code with the path name of image uploaded by user as background. I' using codeigniter file_write. I have inputs to get bg color and title too. I have a layout.php page on view (with 777 permission) But, my code not work, after click on upload button, appers the error: "The upload path does not appear to be valid"

 class Upload extends CI_Controller {

    public function __construct()
        {
            parent::__construct();
            $this->load->helper(array('form', 'url', 'file', 'directory'));
        }

    public function index()
        {
            $this->load->view('upload_form', array('error' => ''));
        }

    public function do_upload()
        {

            $path = $this->input->post('new-folder');
            $title = $this->input->post("title");
            $bgcolor = $this->input->post("bgcolor");

            $upload_path_url = site_url().'uploads/'.$path.'/';

            $config['upload_path'] = './uploads/'.$path.'/';
            $config['allowed_types'] = 'gif|jpg|jpeg|png';
            $config['max_size'] = '2000';
            $config['max_width']  = '1920';

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

            if ( ! $this->upload->do_upload()) {
                $error = array('error' => $this->upload->display_errors('<p class="error">','<p>'));
                $this->load->view('upload_form', $error);

            } else {
                $data = $this->upload->data();

                //set the data for the json array   
                $info->name = $data['file_name'];
                $info->size = $data['file_size'];
                $info->type = $data['file_type'];
                $info->url = $upload_path_url .$data['file_name'];

                $info->thumbnail_url = $upload_path_url .$data['file_name'];
                $info->delete_url = base_url().'upload/deleteImage/'.$data['file_name'];
                $info->delete_type = 'DELETE';

                //this is why we put this in the constants to pass only json data
                if (IS_AJAX) {
                    echo json_encode(array($info));

                // so that this will still work if javascript is not enabled
                } else {
                     echo $upload_path_url;

                    if(!is_dir($path))
                    {
                        mkdir($upload_path_url,0777,TRUE);

                    } 

                    $page_layout = $this->load->view('layout');
                    $write_data = '<div style="width:100%; height:100%; background: url(../uploads/'.$data['file_name'].')"></div></body></html>' ;

                    if ( ! write_file( $page_layout . $write_data, 'a+') )
                    {
                        $msg_file = '<label>Unable to generate the page</label>';
                    }
                    else
                    {
                        $msg_file = '<label>Layout Page was generated!</label>';
                    }


                    $file_data['msg_file'] = $msg_file;
                    $file_data['title'] = $title;
                    $file_data['bgcolor'] = $bgcolor;
                    $file_data['upload_data'] = $this->upload->data();
                    $this->load->view('upload_success', $file_data); 
                }
            }
        }
}

Part of form_upload.php:

<!-- Site title -->
<label>Title:</label>
<input type="text" size="40" name="title" />
<br /><br />
<label>Background color:</label>
<input type='text' value='#fff' name='bgcolor' id='bg' size="10" />
<br /><br />

Part of upload-success.php:

    if ( isset($msg_file) ) { echo $msg_file; }
    echo '<br /><br />';
    echo '<label>Site title: '. $title.'</label>';
    echo '<br />'; 
    //echo $write_data;
    echo '<br />'; 
    echo '<label>background-color: '. $bgcolor.'</label>';
    echo '<br />';

Upvotes: 1

Views: 1717

Answers (1)

Aidas
Aidas

Reputation: 1249

Message "The upload path does not appear to be valid" references to your $config['upload_path'] = './uploads/'.$path.'/' line. It means the directory doesn't exsist and/or has bad permissions. Looking at your code, $path comes via POST data from the form, and you're not creating that folder anywhere BEFORE you do upload. I don't think CI's Upload class creates an upload folder if the one doesn't exist. I've not tested that, but try someting like following:

$config['upload_path'] = './uploads/'.$path.'/';
[...]

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

if (!empty($path) && !file_exists($config['upload_path'])) {
   if (!mkdir($config['upload_path'], 0777, true)) {
    die('Failed to create folders...');
   }
}

if ( ! $this->upload->do_upload()) {
[...]

I'm not talking about POST data check as this is another matter.

Upvotes: 2

Related Questions