开发者

Uploading an image in Codeigniter shows error The upload path does not appear to be valid

开发者 https://www.devze.com 2023-03-09 08:51 出处:网络
$config[\'upload_path\'] = site_path().\'photos/\'; $config[\'allowed_types\'] = \'gif|jpg|png|jpeg\';
$config['upload_path'] = site_path().'photos/';
$config['allowed_types'] = 'gif|jpg|png|jpeg';
$config['max_size'] = '2048';
$this->load->library('upload', $config);    
if ( ! $this->upload->do_upload())
{ 
    $this->data['alert'] = $this->upload->display_errors();                     
    $this->load->view('profile/photo', $this->data);
}   
else
{
    $upload_data = $this->upload->data();

    $filename = $upload_data['file_name'];
    $width = $upload_data['image_width'];
    $height = $upload_data['image_height'];
    $con开发者_运维问答fig1 = array();
    $this->load->library('image_lib');
    $config1['source_image'] = site_path().'photos/'.$filename;


    $this->remove_existing_file($this->session->userdata('user_id'));
    $this->Profile_model->savephoto('Edit', $filename );
    redirect('/profile/photo');
}

I am getting this error:

The upload path does not appear to be valid.


There's only a few reasons for this error to occur:

  1. The directory site_path().'photos/' does not exist, try running is_dir() to ensure that it does.
  2. The directory exists but is not writable. Make sure you have set the appropriate permissions on the directory. Try running is_writable() to make sure.
  3. The directory you want to use exists, but you have not represented it properly to the Upload library. Try using an absolute path with a trailing forward slash, similar to the example in the User Guide.

Beyond that, there is no explanation I can think of. Here is the CI code that validates the path (part of the Upload class):

public function validate_upload_path()
{
    if ($this->upload_path == '')
    {
        $this->set_error('upload_no_filepath');
        return FALSE;
    }

    if (function_exists('realpath') AND @realpath($this->upload_path) !== FALSE)
    {
        $this->upload_path = str_replace("\\", "/", realpath($this->upload_path));
    }

    // This is most likely the trigger for your error
    if ( ! @is_dir($this->upload_path))
    {
        $this->set_error('upload_no_filepath');
        return FALSE;
    }

    if ( ! is_really_writable($this->upload_path))
    {
        $this->set_error('upload_not_writable');
        return FALSE;
    }

    $this->upload_path = preg_replace("/(.+?)\/*$/", "\\1/",  $this->upload_path);
    return TRUE;
}

Update:

Per your comments, try this instead and let's see what happens before moving to the next step of debugging:

$config['upload_path'] = './community/photos/';


$config['upload_path'] = './photos/';
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1000';
$config['max_width'] = '1920';
$config['max_height'] = '1280';                     

$this->upload->initialize($config);

write this code in your controller block

this problem is common i know your wrote this code in __construct() block but right method is use this code in particular Controller where upload code are call.


This should help

If you need to automatically create directories like: ./assets/2016-07-27/ when uploading files then you'll have to extend the Upload library to automatically create directories if they don't exist.

The code:

<?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;
    }
}


How to use:

Simply create application/libraries/MY_Upload.php and paste the code above in it. That's all!


More info:

  • The GitHub Gist.
  • My blog post on Eharry.me


NOTE:

This extension is compatible with CodeIgniter 3.x and 2.x versions.


If you are on windows try writing to "c:\" and see if that works.

Also what is the output of site_path() eg echo site_path(); ?

On xammp I've found I need to write c:\xammp\htdocs\myproject\photos\ instead of just using '\photos\';


Hi on server you can connect with filezilla and right click on folder and change File Attributes


Check your .htaccess file not to block application folder Check is uploads is CHMOD 777 Use var_dump(is_dir('/photos/')); to see is your directory exist! Finally try this:

    $config['upload_path'] = 'photos/';
    $config['allowed_types'] = 'gif|jpg|jpeg|png';
    $config['max_size'] = '1000';
    $config['max_width'] = '1920';
    $config['max_height'] = '1280';                     

    $this->upload->initialize($config);


i think problem can be solve by using

$config['upload_path'] ='./photos/';

instead of

$config['upload_path'] = site_path().'photos/';


I know this has already been answered. Even I had difficulty trying to upload files. But in my case the issue was that I had the CodeIgniter application in a folder outside of /var/www and the index page in the www folder (mainly as a security measure).

The uploads folder should be in the /var/www folder that contains the index.php file. This is what I had to do. The next thing is to give 777 permissions to the uploads folder.


I'm using wamp on windows

$config['upload_path'] = base_url().'./resources/uploads/';

not working at all.

var_dump(is_dir($config['upload_path'])); //return false
var_dump(is_writable($config['upload_path']));  //return false

but when I change it to

$config['upload_path'] = './resources/uploads/';   //works fine

it works fine. So I guess on windows it's not a permission problem.it's caused by the base_url() method .how strange is that.


Try out this code in your Controller

$config['upload_path'] = 'images'; //name of the uploading folder
$config['allowed_types'] = 'jpeg|png|jpg'; 
$config['file_name'] = 'name_for_file'; 

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

if (!$this->upload->do_upload())
 {
  echo $this->upload->display_errors();
  exit;
 }
else
 {
  $upload_data = $this->upload->data();
 } 
0

精彩评论

暂无评论...
验证码 换一张
取 消