续 - 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 );
答案 0 :(得分:7)
我遇到了同样的问题,也许我们可以一起前进。这是我的代码:
/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)之前打印出$ data,则它包含您要保存的正确字段,但它不包含。我尝试使用输入类型=文本而不是type = file并正确保存。
我尝试了另一种方式:输入类型=文件和名称= pdf_file,然后我添加了一个隐藏字段名称=文件默认=“”。然后我将这个隐藏的字段值设置为文件名而没有成功。也许我做错了什么。继续弄清楚。
答案 1 :(得分:1)
您可以使用php move_uploaded_file()
功能
答案 2 :(得分:1)
//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 - 文件名
如果文件成功上传,则运行查询。
答案 3 :(得分:1)
在请求变量中设置文件名,因为它现在是$ _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();
}
}
答案 4 :(得分:0)
在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);
}