загрузка файлов в 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.');
}
}
}
и мой добавить.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')
он сохраняет имя, фамилию, ключевые слова и имя файла в БД , но файл , который я хочу сохранить в приложении/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.');
}
}
}
и мой добавить.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')
и ошибки
Notice (8): преобразование массива в строку [CORECakeModelDatasourceDboSource.php, строка 1005]
ошибка базы данных ошибка: SQLSTATE[42S22]: столбец не найден: 1054 неизвестно столбец "массив" в "списке полей"
SQL Query: вставить в первую очередь.сообщения (firstname, lastname, ключевые слова, doc_file) значения ('dfg',' cbhcfb',' dfdbd', Array)
и Виктор я тоже сделал вашу версию, она тоже не работает .
4 ответов
Вы, кажется, используете неправильный "ключ" для доступа к размещенной информации;
$this->data['posts'][....
должно соответствовать "псевдониму" вашей модели;особой и captial первая буква
$this->data['Post'][....
и $this->data
- это оболочка для $this->request->data
для обратной совместимости, поэтому лучше использовать это:
$this->request->data['Post'][...
чтобы проверить содержимое опубликованных данных и понять, как оно структурировано, вы можете отладить его с помощью это:
debug($this->request);
просто не забудьте включить отладку, установив debug
to 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()
используя только файл имя для база данных
на "преобразование массива в строку" проблема вызвана тем, что вы пытаетесь напрямую использовать данные "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;
..убедитесь, что каталог документов уже существует и у вас есть разрешения на запись в него? Если он не существует, создайте его или в своем коде проверьте, существует ли он, и создайте его, если его нет: пример кода, который будет проверять, есть ли каталог или нет, и создать его, а затем загрузить файл -
$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);
}
также убедитесь, что вы не загружаете пустой/пустой файл - это может привести к сбою.
просто incase кто-то ищет его снова. Вот мой код (протестирован и используется на 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 {...}
}
}
Я нашел полное руководство по загрузке файлов и изображений в CakePHP отсюда - обработка загрузки файлов в CakePHP
пример кода приведен ниже.