загрузка файла в cakephp 2.3

Я новичок в cakephp, и я пытаюсь создать простую загрузку файла с помощью cakephp 2.3, вот мой контроллер

public function add() {
    if ($this->request->is('post')) {
        $this->Post->create();
           $filename = WWW_ROOT. DS . 'documents'.DS.$this->data['posts']['doc_file']['name']; 
           move_uploaded_file($this->data['posts']['doc_file']['tmp_name'],$filename);  


        if ($this->Post->save($this->request->data)) {
            $this->Session->setFlash('Your post has been saved.');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash('Unable to add your post.');
        }
     }
 }

и мой add.ctp

echo $this->Form->create('Post');
echo $this->Form->input('firstname');
echo $this->Form->input('lastname');
echo $this->Form->input('keywords');
echo $this->Form->create('Post', array( 'type' => 'file'));
echo $this->Form->input('doc_file',array( 'type' => 'file'));
echo $this->Form->end('Submit')

он сохраняет имя, фамилию, ключевые слова и имя файла в БД, но файл, который я хочу сохранить в app/webroot/documents, не сохраняется, может ли кто-нибудь помочь? Спасибо

Обновить

thaJeztah, я сделал, как ты сказал, но это дает некоторые ошибки, вот контроллер, если я не ошибаюсь

public function add() {
     if ($this->request->is('post')) {
         $this->Post->create();
            $filename = WWW_ROOT. DS . 'documents'.DS.$this->request->data['Post']['doc_file']['name']; 
           move_uploaded_file($this->data['posts']['doc_file']['tmp_name'],$filename);



         if ($this->Post->save($this->request->data)) {
             $this->Session->setFlash('Your post has been saved.');
             $this->redirect(array('action' => 'index'));
         } else {
            $this->Session->setFlash('Unable to add your post.');
         }
     }

 }

и мой add.ctp

 echo $this->Form->create('Post', array( 'type' => 'file'));
 echo $this->Form->input('firstname'); echo $this->Form->input('lastname');
 echo $this->Form->input('keywords');
 echo $this->Form->input('doc_file',array( 'type' => 'file'));
 echo $this->Form->end('Submit') 

и ошибки

Примечание (8): преобразование массива в строку [CORE\Cake\Model\Datasource\DboSource.php, строка 1005]

Ошибка базы данных Ошибка: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «Массив» в «списке полей»

SQL-запрос: ВСТАВИТЬ В first.posts (имя, фамилия, ключевые слова, doc_file) ЗНАЧЕНИЯ ('dfg', 'cbhcfb', 'dfdbd', массив)

и Виктор, я тоже сделал твой вариант, он тоже не работает.


person Hovo    schedule 28.04.2013    source источник


Ответы (4)


Похоже, вы используете неправильный «ключ» для доступа к опубликованным данным;

$this->data['posts'][....

Должен совпадать с «псевдонимом» вашей модели; единственное число и заглавная первая буква

$this->data['Post'][....

Кроме того, $this->data является оболочкой для $this->request->data для обратной совместимости, поэтому лучше использовать это;

$this->request->data['Post'][...

Чтобы проверить содержимое опубликованных данных и понять, как они структурированы, вы можете отладить их, используя это;

debug($this->request);

Просто не забудьте включить отладку, установив debug в 1 или 2 внутри app/Config/core.php

Обновлять; дублировать теги формы!

Я только что заметил, что вы также создаете несколько (вложенных) форм в своем коде;

echo $this->Form->input('keywords');

// This creates ANOTHER form INSIDE the previous one!
echo $this->Form->create('Post', array( 'type' => 'file'));

echo $this->Form->input('doc_file',array( 'type' => 'file'));

Вложенные формы никогда не будут работать, удалите эту строку и добавьте 'type =› file' к первому Form->create()

Использование только файла name для базы данных

Проблема с преобразованием массива в строку связана с тем, что вы пытаетесь напрямую использовать данные 'doc_file' для своей базы данных. Поскольку это поле для загрузки файла, 'doc_file' будет содержать массив данных ('name', 'tmp_name' и т. д.).

Для вашей базы данных вам нужно только «имя» этого массива, поэтому вам нужно изменить данные, прежде чем сохранять их в базу данных.

Например, например таким образом;

// Initialize filename-variable
$filename = null;

if (
    !empty($this->request->data['Post']['doc_file']['tmp_name'])
    && is_uploaded_file($this->request->data['Post']['doc_file']['tmp_name'])
) {
    // Strip path information
    $filename = basename($this->request->data['Post']['doc_file']['name']); 
    move_uploaded_file(
        $this->data['Post']['doc_file']['tmp_name'],
        WWW_ROOT . DS . 'documents' . DS . $filename
    );
}

// Set the file-name only to save in the database
$this->data['Post']['doc_file'] = $filename;
person thaJeztah    schedule 29.04.2013
comment
@Hovo, во-первых, ты все еще используешь здесь не тот ключ; $this->data['posts']['doc_file']['tmp_name'], который должен быть $this->data['Post']['doc_file']['tmp_name']. Однако проблема, которую вы видите, вызвана тем, что вы пытаетесь использовать $this->data['Post']['doc_file'] в качестве значения для поля «doc_file» в своей базе данных, но поскольку это массив, это не будет работать напрямую. Вам придется изменить эти данные и использовать только имя файла для вашей базы данных. попробую добавить пример - person thaJeztah; 01.05.2013

На всякий случай, если кто-то ищет его снова. Вот мой код (протестирован и использован на Cakephp 2.5.5). Он основан на http://www.templemantwells.com.au/article/website-development/cakephp-image-uploading-with-database & http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::file

Просмотреть файл (*.ctp)

    <?php 
    echo $this->Form->create('Image', array('type' => 'file'));
?>


    <fieldset>
        <legend><?php echo __('Add Image'); ?></legend>
    <?php


        echo $this->Form->input('Image.submittedfile', array(
            'between' => '<br />',
            'type' => 'file',
            'label' => false
        ));
        // echo $this->Form->file('Image.submittedfile');

    ?>
    </fieldset>
<?php echo $this->Form->end(__('Send My Image')); ?>

Функция контроллера (*.php)

    public function uploadPromotion() {

    // Custom
    $folderToSaveFiles = WWW_ROOT . 'img/YOUR_IMAGE_FOLDER/' ;




    if (!$this->request->is('post')) return;        // Not a POST data!


    if(!empty($this->request->data))
    {
        //Check if image has been uploaded
        if(!empty($this->request->data['Image']['submittedfile']))
        {
                $file = $this->request->data['Image']['submittedfile']; //put the data into a var for easy use

                debug( $file );

                $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension
                $arr_ext = array('jpg', 'jpeg', 'gif'); //set allowed extensions

                //only process if the extension is valid
                if(in_array($ext, $arr_ext))
                {


                    //do the actual uploading of the file. First arg is the tmp name, second arg is 
                    //where we are putting it
                    $newFilename = $file['name']; // edit/add here as you like your new filename to be.
                    $result = move_uploaded_file( $file['tmp_name'], $folderToSaveFiles . $newFilename );

                    debug( $result );

                    //prepare the filename for database entry (optional)
                    //$this->data['Image']['image'] = $file['name'];
                }
        }

        //now do the save (optional)
        //if($this->Image->save($this->data)) {...} else {...}
    }




}
person Britc    schedule 17.11.2014

..убедитесь, что каталог документов уже существует, и проверьте, есть ли у вас права на запись в него? Если он не существует, создайте его или в своем коде проверьте, существует ли он, и создайте его, если его нет: пример кода, который проверит, существует ли каталог или нет, и создаст его, а затем загрузите файл-

$dir = WWW_ROOT. DS . 'documents';
 if(file_exists($dir) && is_dir($dir))
 {
    move_uploaded_file($this->data['posts']['doc_file']['tmp_name'],$filename);  
 }
 elseif(mkdir($dir,0777))
 {
  move_uploaded_file($this->data['posts']['doc_file']['tmp_name'],$filename);  
  }

также убедитесь, что вы не загружаете пустой/пустой файл - это может привести к сбою.

person Victor    schedule 29.04.2013

Я нашел полное руководство по загрузке файлов и изображений в CakePHP здесь — Обработка загрузки файлов в CakePHP

Пример кода приведен ниже.

Контроллер:

$fileName = $this->request->data['file']['name'];
$uploadPath = 'uploads/files/';
$uploadFile = $uploadPath.$fileName;
if(move_uploaded_file($this->request->data['file']['tmp_name'],$uploadFile)){
    //DB query goes here
}

Просмотр:

<?php echo $this->Form->create($uploadData, ['type' => 'file']); ?>
    <?php echo $this->Form->input('file', ['type' => 'file', 'class' => 'form-control']); ?>
    <?php echo $this->Form->button(__('Upload File'), ['type'=>'submit', 'class' => 'form-controlbtn btn-default']); ?>
<?php echo $this->Form->end(); ?>
person JoyGuru    schedule 05.05.2016