Как сохранить имя загруженного файла в базе данных

Прод. -Добавить загрузчик файлов в Joomla Admin Component

Я мог бы загрузить файл и сохранить его на диске. Но это не сохранение имени файла в базе данных.

Как я могу это сделать ?

Вот контроллер -

class InvoiceManagerControllerInvoiceManager extends JControllerForm
{
    function save(){
        $file = JRequest::getVar('jform', null, 'files', 'array');
        $path = JPATH_BASE;

        // Make the file name safe.
        jimport('joomla.filesystem.file');
        $file['name']['invoice'] = JFile::makeSafe($file['name']['invoice']);

        // Move the uploaded file into a permanent location.
        if (isset($file['name']['invoice'])) {
            // Make sure that the full file path is safe.
            $filepath = JPath::clean($path. DS ."components". DS ."com_invoicemanager". DS ."files". DS .strtolower($file['name']['invoice']));
            // Move the uploaded file.
            JFile::upload( $file['tmp_name']['invoice'], $filepath );
        }

        return parent::save();
    }
}

Поле формы в XML -

<field name="invoice" type="file"/>

ОБНОВЛЕНИЕ: работает после добавления следующих строк, взятых из кода @Andras Gera

$data = JRequest::getVar( 'jform', null, 'post', 'array' );
$data['invoice'] = strtolower( $file['name']['invoice'] );

JRequest::setVar('jform', $data );

Ответы на вопрос(5)

move_uploaded_file() функция

 ChamingaD17 окт. 2012 г., 07:14
Файл успешно сохранен на диске. Мне просто нужно сохранить его имя в базе данных после загрузки.

так как теперь это переменная $ _FILES

JRequest::setVar('jform[invoice]',$file['name']['invoice'] );

// полный код

   class InvoiceManagerControllerInvoiceManager extends JControllerForm
    {
        function save(){
            $file = JRequest::getVar('jform', null, 'files', 'array');
            $path = JPATH_BASE;

            // Make the file name safe.
            jimport('joomla.filesystem.file');
            $file['name']['invoice'] = JFile::makeSafe($file['name']['invoice']);

            // Move the uploaded file into a permanent location.
            if (isset($file['name']['invoice'])) {
                // Make sure that the full file path is safe.
                $filepath = JPath::clean($path. DS ."components". DS ."com_invoicemanager". DS ."files". DS .strtolower($file['name']['invoice']));
                // Move the uploaded file.
                JFile::upload( $file['tmp_name']['invoice'], $filepath );

                JRequest::setVar('jform[invoice]',$file['name']['invoice'] );
            }



            return parent::save();
        }

}
 Irfan17 окт. 2012 г., 12:05
@ChamingaD: Test this-> JRequest :: setVar ('column', 'test'); Если это работает, тогда есть некоторые проблемы с именами
 ChamingaD17 окт. 2012 г., 11:50
хм не работает. столбец для имени файла все еще пуст: /
 ChamingaD17 окт. 2012 г., 12:03
да, он успешно загружает файл :)
 ChamingaD17 окт. 2012 г., 12:38
хм как это проверить?
 Irfan17 окт. 2012 г., 12:00
@ChamingaD: Ваш код загружает файл?
Решение Вопроса

может быть, мы можем идти вперед вместе. Вот мои коды:

/administrator/components/com_comp_name/models/forms/edit.xml

<?xml version="1.0" encoding="utf-8"?>
<form addrulepath="/administrator/components/com_gonewsletter/models/rules">
    <fieldset name="details">
        <field
            name="id"
            type="hidden"
        />
        <field
            name="title"
            type="text"
            label="COM_GONEWSLETTER_EDIT_TITLE_LABEL"
            description="COM_GONEWSLETTER_EDIT_TITLE_DESC"
            size="40"
            class="inputbox"
            required="true"
            default=""
        />
        <field
            name="date"
            type="calendar"
            label="COM_GONEWSLETTER_EDIT_DATE_LABEL"
            description="COM_GONEWSLETTER_EDIT_DATE_DESC"
            size="40"
            class="inputbox"
            required="true"
            default=""
            format="%Y-%m-%d"
        />
        <field
            name="published"
            type="list"
            label="JSTATUS"
            description="COM_GONEWSLETTER_EDIT_PUBLISHED_DESC"
            class="inputbox"
            size="1"
            default="0">
            <option
                value="1">JPUBLISHED</option>
            <option
                value="0">JUNPUBLISHED</option>
        </field>
        <field
            type="file"
            name="pdf_file"
            label="COM_GONEWSLETTER_EDIT_FILE_LABEL"
            default=""
            description="COM_GONEWSLETTER_EDIT_FILE_DESC"
            size="40"
            accept="application/pdf"
            class="fileuploader"
        />
        <field
            name="file"
            type="hidden"
        />
    </fieldset>
</form>

и /administrator/components/com_comp_name/controllers/edit.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla controllerform library
jimport('joomla.application.component.controllerform');

/**
 * GoNewsletter Controller
 */
class GoNewsletterControllerEdit extends JControllerForm
{
    function __construct($config = array()) {
        $this->view_list = 'List';
        parent::__construct($config);
    }

    function save(){
        // ---------------------------- Uploading the file ---------------------
        // Neccesary libraries and variables
        jimport( 'joomla.filesystem.folder' );
        jimport('joomla.filesystem.file');
        $data = JRequest::getVar( 'jform', null, 'post', 'array' );

        // Create the gonewsleter folder if not exists in images folder
        if ( !JFolder::exists( JPATH_SITE . DS . "images" . DS . "gonewsletter" ) ) {
            JFolder::create( JPATH_SITE . DS . "images" . DS . "gonewsletter" );
        }

        // Get the file data array from the request.
        $file = JRequest::getVar( 'jform', null, 'files', 'array' );

        // Make the file name safe.
        $filename = JFile::makeSafe($file['name']['pdf_file']);

        // Move the uploaded file into a permanent location.
        if ( $filename != '' ) {
            // Make sure that the full file path is safe.
            $filepath = JPath::clean( JPATH_SITE . DS . 'images' . DS . 'gonewsletter' . DS . strtolower( $filename ) );

            // Move the uploaded file.
            JFile::upload( $file['tmp_name']['pdf_file'], $filepath );
            // Change $data['file'] value before save into the database 
            $data['file'] = strtolower( $filename );
        }
        // ---------------------------- File Upload Ends ------------------------

        JRequest::setVar('jform', $data );

        return parent::save();
    }

}

Если вы распечатываете $ data перед отправкой его в parent :: save ($ data), он содержит нужные поля, которые вы хотите сохранить, но это не так. Я попытался использовать тип ввода = текст вместо типа = файл, и он сохраняет правильно.

Я попробовал другой способ, например: input type = file и name = pdf_file, после чего я добавил скрытое поле name = file default = "". И тогда я установил это скрытое значение поля в имя файла без успеха. Может быть, я что-то делал не так. Продолжайте продолжать выяснять что-то.

 Andras Gera17 окт. 2012 г., 11:26
Я думаю, что мы должны вернуть измененные $ data в метод POST, потому что parent :: save () возвращается в систему save (). Каким-то образом, если я добавлю $ data для функции save (), это не поможет. Сохраняет все, но только поле файла пусто в БД.
 ChamingaD17 окт. 2012 г., 12:40
Вы нашли в любом случае, чтобы сделать это?
 Andras Gera17 окт. 2012 г., 13:05
Я завершу код выше, чтобы сделать его лучше. На этом этапе вы потеряете файловую переменную при редактировании записи.
 Andras Gera17 окт. 2012 г., 12:47
Да, это решено! Спасибо за то, что Irfan упомянул функцию setVar. Это решение не работает, потому что оно создает другую запись вместо помещения нужной переменной в массив jform в массиве $ _REQUEST. Мое решение переопределяет переменную jform.
 Andras Gera17 окт. 2012 г., 13:24
Это фиксированная. Проверьте xml и php код внимательно. Я добавил скрытое поле, чтобы сохранить исходное имя файла при редактировании других частей формы. Когда вы выбрали новый файл, замените его. Есть еще что-то, что нужно исправить, но я надеюсь, что это очень поможет продвинуться вперед. ура

а модели, чтобы сохранить имя загруженного файла в db, как это

public function save($data){
  $input = JFactory::getApplication()->input;       
  $files = $input->files->get('jform');
  $fieldName = 'thumbnail';
  $data['thumbnail'] = $files[$fieldName]['name'];              
  return parent::save($data);
}
    //import joomlas filesystem functions, we will do all the filewriting with joomlas functions
        jimport('joomla.filesystem.file');
        jimport('joomla.filesystem.folder');

      //this is the name of the field in the html form, filedata is the default name for swfupload
    $fieldName = 'Filedata';

        //the name of the file in PHP's temp directory that we are going to move to our folder
        $fileTemp = $_FILES[$fieldName]['tmp_name'];


        //always use constants when making file paths, to avoid the possibilty of remote file inclusion
        $uploadPath = JPATH_SITE.DS.'path'.DS.'path'.DS.$fileName;

        if(!JFile::upload($fileTemp, $uploadPath)) 
        {
                echo JText::_( 'ERROR MOVING FILE' );
                return;
        }
        else
        {
         //Updating the db with the $fileName.
         $db =& JFactory::getDBO();   
         $query = $db->getQuery(true);
         $query->update($db->nameQuote(TABLE_PREFIX.'table_name'));
         $query->set($column.' = '.$db->quote($fileName));
         $query->where($db->nameQuote('id').'='.$db->quote($id));             
         $db->setQuery($query);
         $db->query(); 
         }

Запрос запускается, если файл успешно загружен.

 ChamingaD17 окт. 2012 г., 07:21
Спасибо Dasun, загрузка файлов теперь в порядке. Я застрял в обновлении базы данных: /
 ChamingaD17 окт. 2012 г., 08:06
я сделал, как вы упомянули. но это не работает: / вот часть сохранения файла в моем компоненте -pastebin.com/yKiiBigu .. заменил $ столбец на $ invoice, который VARCHAR в моей таблице. var_dump of $ db -pastebin.com/MyCdKrAB
 Techie17 окт. 2012 г., 08:23
вы пропускаете оператор if в JFile :: upload ($ fileTemp, $ uploadPath). Пожалуйста, укажите, например, правильно и внесите изменения в ваш код. Если у вас возникнут какие-либо вопросы, пожалуйста, задавайте.
 ChamingaD17 окт. 2012 г., 10:18
хм я думаю, что проблема исходит от запроса. Столбец $ (счет-фактура $ в моем случае) не определен. и $ id.
 Techie17 окт. 2012 г., 07:23
проверить поправки

Ваш ответ на вопрос