Search code examples
phpfile-uploaduploadfuelphp

Simple File Upload for FuelPHP


Does anyone have experience of uploading a series of files to a web server with FuelPHP?

My current setup adds content to a database from a Form, but I'd like to process images at this point too - so basically move them to my web server when submitting a form.

Is this simple to do?

I have my 'action_add()' method in my controller, but not sure how to update it to loop through all my file fields and move files.

public function action_add()
    {
        $val = Model_Article::validate('add_article');

        if ($val->run())
        {
            $status = (Input::post('save_draft') ? 0 : 1);

            if ( ! $val->input('category_id'))
            {
                $category_id = null;
            }
            else
            {
                $category_id = $val->validated('category_id');
            }

            $article = new Model_Article(array(
                'user_id' => $this->user_id,
                'category_id' => $category_id,
                'title' => $val->validated('title'),
                'body' => $val->validated('body'),
                'published' => $status,
            ));

            if ($article->save())
            {
                Session::set_flash('success', 'Article successfully added.');
            }
            else
            {
                Session::set_flash('error', 'Something went wrong, '.
                    'please try again!');
            }

            Response::redirect('articles/add');
        }

        $this->template->title = 'Add Article';
        $this->template->content = View::forge('articles/add')
            ->set('categories', Model_Category::find('all'), false)
            ->set('val', Validation::instance('add_article'), false);
    }

My Form:

<h2>Add an Article</h2>
<p>Publish a new article by filling the form below.</p>

<div class="options">
    <div class="option">
            <?php echo Html::anchor('articles', 'View Articles'); ?>
    </div>
    <div class="option">
        <?php echo Html::anchor('categories/add', 'Add a Category'); ?>
    </div>
</div>

<?php echo $val->show_errors(); ?>
<?php echo Form::open(array('enctype' => 'multipart/form-data')); ?>

<?php $select_categories = array(null => 'Uncategorized'); ?>
<?php foreach ($categories as $category): ?>
<?php $select_categories[$category->id] = $category->name; ?>
<?php endforeach; ?>

<div class="input select">
    <?php echo Form::label('Category', 'category_id'); ?>
    <?php echo Form::select('category_id', e($val->input('category_id')), 
        $select_categories); ?>
</div>

<div class="input text required">
    <?php echo Form::label('Title', 'title'); ?>
    <?php echo Form::input('title', e($val->input('title')), 
        array('size' => '30')); ?>
</div>

<div class="input textarea required">
    <?php echo Form::label('Body', 'body'); ?>
    <?php echo Form::textarea('body', e($val->input('body')), 
        array('rows' => 4, 'cols' => 40)); ?>
</div>

<div class="input textarea required">
    <?php echo FORM::file('filename'); ?> 
</div>

<div class="input submit">
    <?php echo Form::submit('add_article', 'Publish'); ?>
    <?php echo Form::submit('save_draft', 'Save Draft'); ?>
</div>

<?php echo Form::close(); ?>

Many thanks for any pointers.


Solution

  • Okay I can give you some instruction.

    First fuelphp upload documentation

    Hope it helps sorry if there are typos in it

    public function action_add()
    {
    $val = Model_Article::validate('add_article'); //<-- maybe its just me but I never saw any similar to this in fuelphp sorry about this if I'm wrong
    
    // if your form validation is okay than continue with everyhing else
    if ($val->run())
    {
        $article = Model_Article::forge();
        // Custom configuration for this upload
        $config = array(
            'path' => DOCROOT.DS.'foldername/tomove/your/images',
            'randomize' => true,
            'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'),
        );
    
        Upload::process($config);
    
        // if a valid file is passed than the function will save, or if its not empty
        if (Upload::is_valid())
        {
            // save them according to the config
            Upload::save();
    
           //if you want to save to tha database lets grab the file name
            $value = Upload::get_files();  
            $article->your_file_input_name = $value[0]['saved_as'];
         } 
    
        $status = (Input::post('save_draft') ? 0 : 1);
    
        if ( ! $val->input('category_id'))
        {
            $category_id = null;
        }
        else
        {
            $category_id = $val->validated('category_id');
        }
    
             $article->user_id = $this->user_id;
             $article->category_i = $category_id;
             $article->title = $val->validated('title');
             $article->body = $val->validated('body');
             $article->published = $status;
    
    
        if ($article->save())
        {
            Session::set_flash('success', 'Article successfully added.');
        }
        else
        {
            Session::set_flash('error', 'Something went wrong, '.
                'please try again!');
        }
    
        Response::redirect('articles/add');
    }
    
    $this->template->title = 'Add Article';
    $this->template->content = View::forge('articles/add')
        ->set('categories', Model_Category::find('all'), false)
        ->set('val', Validation::instance('add_article'), false);
    }