【问题标题】:How to Save Uploaded File's Name on Database如何在数据库中保存上传文件的名称
【发布时间】:2012-10-07 07:21:14
【问题描述】:

续。 - Add File Uploader to 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 );

【问题讨论】:

    标签: php file-upload joomla joomla2.5


    【解决方案1】:

    我也遇到了同样的问题,也许我们可以一起前进。这是我的代码:

    /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) 之前打印出它,它包含您要保存的正确字段,但它没有。我尝试使用输入 type=text 而不是 type=file 并正确保存。

    我尝试了另一种方式,例如:输入 type=file 和 name=pdf_file,然后我添加了一个隐藏字段 name=file default=""。然后我将这个隐藏字段值设置为文件名,但没有成功。也许我做错了什么。继续想办法。

    【讨论】:

    • 我认为我们应该将更改后的 $data 传递回 POST 方法,因为 parent::save() 会返回到系统 save()。不知何故,如果我将 $data 添加到 save() 函数,它就不会很好。保存所有内容,但数据库中只有文件字段为空。
    • 你找到了吗?
    • 是的,它解决了!感谢 Irfan 提到 setVar 函数。他的解决方案不起作用,因为它创建了另一条记录,而不是将所需的变量放入 $_REQUEST 数组中的 jform 数组中。我的解决方案是覆盖 jform 变量。
    • 我将完成上面的代码以使其更好。在此阶段,您将在编辑记录时丢失文件变量。
    • 已修复。仔细检查 xml 和 php 代码。当您编辑表单的其他部分时,我添加了一个隐藏字段以保留原始文件名。当您选择一个新文件时,然后替换它。还有更多需要解决的问题,但我希望它对前进有很大帮助。干杯
    【解决方案2】:

    可以使用phpmove_uploaded_file()函数

    【讨论】:

    • 文件已成功保存在磁盘上。我只需要在上传后将其名称存储在数据库中。
    【解决方案3】:
        //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(); 
             }
    

    $column - 文件的 db 列名 $fileName - 文件名

    如果文件成功上传,则运行查询。

    【讨论】:

    • 感谢大顺,现在可以上传文件了。我一直在更新数据库:/
    • 我照你说的做了。但它不起作用:/ 这是我组件中的文件保存部分 - pastebin.com/yKiiBigu .. 用 $invoice 替换了 $column ,其中 VARCHAR 在我的表中。 $db 的 var_dump - pastebin.com/MyCdKrAB
    • 您缺少 JFile::upload($fileTemp, $uploadPath) 的 if 语句。请正确参考例如并更改您的代码。如果您遇到任何问题,请提出。
    • 嗯我认为问题来自查询。 $column(在我的例子中是 $invoice)没有定义。和 $id。
    • 这里是修改后的代码 -pastebin.com/ytRLEJJZ $db 的 var_dump -pastebin.com/JqJnQMZk
    【解决方案4】:

    在请求变量中设置文件名,因为它现在是 $_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();
            }
    
    }
    

    【讨论】:

    • @ChamingaD: 测试这个-> JRequest::setVar('column','test' );如果这样可行,则存在一些命名问题
    • @ChamingaD: 列名是什么?
    【解决方案5】:

    在 joomla 3.2.x 上,我必须重写模型类的保存功能才能将上传的文件名保存到 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 2015-03-30
      • 2013-08-08
      • 1970-01-01
      相关资源
      最近更新 更多