2015-04-15 9 views
9

Я хочу загрузить изображения в приложение cakephp 3.0. Но я получаю сообщение об ошибке:cakePHP 3.0 Загрузка изображений

Notice (8): Undefined index: Images [APP/Controller/ImagesController.php, line 55] 

Есть уже некоторые примеры для загрузки файлов (сразу несколько файлов) в CakePHP 3.0? Потому что я могу найти только примеры для cakePHP 2.x!

Я думаю, мне нужно добавить собственный метод проверки в моем ImageTable.php? Но я не могу заставить его работать.

ImagesTable

public function initialize(array $config) { 
    $validator 
     ->requirePresence('image_path', 'create') 
     ->notEmpty('image_path') 
     ->add('processImageUpload', 'custom', [ 
      'rule' => 'processImageUpload' 
     ]) 
} 

public function processImageUpload($check = array()) { 
    if(!is_uploaded_file($check['image_path']['tmp_name'])){ 
     return FALSE; 
    } 
    if (!move_uploaded_file($check['image_path']['tmp_name'], WWW_ROOT . 'img' . DS . 'images' . DS . $check['image_path']['name'])){ 
     return FALSE; 
    } 
    $this->data[$this->alias]['image_path'] = 'images' . DS . $check['image_path']['name']; 
    return TRUE; 
} 

ImagesController

public function add() 
    { 
     $image = $this->Images->newEntity(); 
     if ($this->request->is('post')) { 
      $image = $this->Images->patchEntity($image, $this->request->data); 

      $data = $this->request->data['Images']; 
      //var_dump($this->request->data); 
      if(!$data['image_path']['name']){ 
       unset($data['image_path']); 
      } 

      // var_dump($this->request->data); 
      if ($this->Images->save($image)) { 
       $this->Flash->success('The image has been saved.'); 
       return $this->redirect(['action' => 'index']); 
      } else { 
       $this->Flash->error('The image could not be saved. Please, try again.'); 
      } 
     } 
     $images = $this->Images->Images->find('list', ['limit' => 200]); 
     $projects = $this->Images->Projects->find('list', ['limit' => 200]); 
     $this->set(compact('image', 'images', 'projects')); 
     $this->set('_serialize', ['image']); 
    } 

add.ctp Изображение

<?php 
    echo $this->Form->input('image_path', [ 
     'label' => 'Image', 
     'type' => 'file' 
     ] 
    ); 
?> 

Изображение Entity

protected $_accessible = [ 
    'image_path' => true, 
]; 

ответ

4

Возможно следующее поможет. Это поведение, которое помогает вам загружать файлы очень просто!

http://cakemanager.org/docs/utils/1.0/behaviors/uploadable/

Позвольте мне знать, если вы боретесь.

Greetz

+0

Эй, помогите, пожалуйста? Я установил выше, выполнил то, что он говорит в документах, но не загружает файлы или не сохраняет имена файлов в БД. Есть идеи? – Deej

+0

Свяжитесь с нами через gitter.im/bobmulder и поделитесь кодом ... – Bob

+0

@SyamsoulAzrien вы должны задать новый вопрос :-) – Spriz

0

Теперь, когда каждый делает рекламу для своих плагинов здесь, позвольте мне сделать это, как хорошо. Я проверил загружаемое поведение, связанное с другим вопросом, это довольно просто и наполовину сделано.

Если вы хотите, чтобы полное решение было выполнено на масштабе на уровне предприятия, проверьте FileStorage. У него есть некоторые функции, которые я еще не видел ни в каких других реализациях, но позаботился о том, чтобы гарантировать, что вы не столкнетесь с ограничениями файловой системы в случае, если вы получите действительно множество файлов. Он работает вместе с Imagine для обработки изображений. Вы можете использовать каждый отдельно или в сочетании, это следует за SoC.

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

Существует quick start guide, чтобы увидеть, как легко осуществить его. Из него выведен следующий код, это полный пример, см. Краткое руководство по началу работы, это более подробно.

class Products extends Table { 
    public function initialize() { 
     parent::initialize(); 
     $this->hasMany('Images', [ 
      'className' => 'ProductImages', 
      'foreignKey' => 'foreign_key', 
      'conditions' => [ 
       'Documents.model' => 'ProductImage' 
      ] 
     ]); 
     $this->hasMany('Documents', [ 
      'className' => 'FileStorage.FileStorage', 
      'foreignKey' => 'foreign_key', 
      'conditions' => [ 
       'Documents.model' => 'ProductDocument' 
      ] 
     ]); 
    } 
} 

class ProductsController extends ApController { 
    // Upload an image 
    public function upload($productId = null) { 
     if (!$this->request->is('get')) { 
      if ($this->Products->Images->upload($productId, $this->request->data)) { 
       $this->Session->set(__('Upload successful!'); 
      } 
     } 
    } 
} 

class ProductImagesTable extends ImageStorageTable { 
    public function uploadImage($productId, $data) { 
     $data['adapter'] = 'Local'; 
     $data['model'] = 'ProductImage', 
     $data['foreign_key'] = $productId; 
     $entity = $this->newEntity($data); 
     return $this->save($data); 
    } 
    public function uploadDocument($productId, $data) { 
     $data['adapter'] = 'Local'; 
     $data['model'] = 'ProductDocument', 
     $data['foreign_key'] = $productId; 
     $entity = $this->newEntity($data); 
     return $this->save($data); 
    } 
} 
0
/*Path to Images folder*/ 
$dir = WWW_ROOT . 'img' .DS. 'thumbnail'; 
/*Explode the name and ext*/ 
       $f = explode('.',$data['image']['name']); 
       $ext = '.'.end($f); 
    /*Generate a Name in my case i use ID & slug*/ 
       $filename = strtolower($id."-".$slug); 

    /*Associate the name to the extension */ 
       $image = $filename.$ext; 


/*Initialize you object and update you table in my case videos*/ 
       $Videos->image = $image;  
      if ($this->Videos->save($Videos)) { 
/*Save image in the thumbnail folders and replace if exist */ 
      move_uploaded_file($data['image']['tmp_name'],$dir.DS.$filename.'_o'.$ext); 

      unlink($dir.DS.$filename.'_o'.$ext); 
       } 
0
<?php 
namespace App\Controller\Component; 

use Cake\Controller\Component; 
use Cake\Controller\ComponentRegistry; 
use Cake\Network\Exception\InternalErrorException; 
use Cake\Utility\Text; 

/** 
* Upload component 
*/ 
class UploadRegCompanyComponent extends Component 
{ 

    public $max_files = 1; 


    public function send($data) 
    { 
     if (!empty($data)) 
     { 
      if (count($data) > $this->max_files) 
      { 
       throw new InternalErrorException("Error Processing Request. Max number files accepted is {$this->max_files}", 1); 
      } 

      foreach ($data as $file) 
      { 
       $filename = $file['name']; 
       $file_tmp_name = $file['tmp_name']; 
       $dir = WWW_ROOT.'img'.DS.'uploads/reg_companies'; 
       $allowed = array('png', 'jpg', 'jpeg'); 
       if (!in_array(substr(strrchr($filename , '.') , 1) , $allowed)) 
       { 
        throw new InternalErrorException("Error Processing Request.", 1);  
       } 
       elseif(is_uploaded_file($file_tmp_name)) 
       { 
        move_uploaded_file($file_tmp_name, $dir.DS.Text::uuid().'-'.$filename); 
       } 
      } 
     } 
    } 
} 
9

В файле вида, добавить, как это, в моем случае Users/приборную панель.CTP

<div class="ChImg"> 
<?php 
echo $this->Form->create($particularRecord, ['enctype' => 'multipart/form-data']); 
echo $this->Form->input('upload', ['type' => 'file']); 
echo $this->Form->button('Update Details', ['class' => 'btn btn-lg btn-success1 btn-block padding-t-b-15']); 
echo $this->Form->end();  
?> 
</div> 

В контроллере добавить, как это, в моем случае UsersController

if (!empty($this->request->data)) { 
if (!empty($this->request->data['upload']['name'])) { 
$file = $this->request->data['upload']; //put the data into a var for easy use 

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

//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 
    move_uploaded_file($file['tmp_name'], WWW_ROOT . '/upload/avatar/' . $setNewFileName . '.' . $ext); 

    //prepare the filename for database entry 
    $imageFileName = $setNewFileName . '.' . $ext; 
    } 
} 

$getFormvalue = $this->Users->patchEntity($particularRecord, $this->request->data); 

if (!empty($this->request->data['upload']['name'])) { 
      $getFormvalue->avatar = $imageFileName; 
} 


if ($this->Users->save($getFormvalue)) { 
    $this->Flash->success('Your profile has been sucessfully updated.'); 
    return $this->redirect(['controller' => 'Users', 'action' => 'dashboard']); 
    } else { 
    $this->Flash->error('Records not be saved. Please, try again.'); 
    } 
} 

Перед использованием этого создайте папку в вебсервера имени загрузки/аватар.

Примечание: вход («Name Here»), используется в

$this->request->data['upload']['name'] 

вы можете распечатать его, если вы хотите, чтобы увидеть результат массива.

Его работает как шарм в CakePHP 3.x

+0

Чувак Я пробовал ваш код, и загрузка изображений работала очень хорошо. Но проблема в том, что никакие другие полевые данные сейчас не сохраняются. Почему это так?? Нужно ли мне делать какие-либо изменения, чтобы обеспечить правильное сохранение? –

+0

$ this-> request-> данные должны возвращать данные формы 'name', как в имени столбца для ex: email в имени таблицы должно быть в текстовом поле электронной почты. Остальное работает так же. Никаких изменений не требуется. –

+0

@PrassannaD не удалось открыть поток: нет такого файла или каталога move_uploaded_file() [function.move-uploaded-file]: Не удалось переместить –

0

Мы используем https://github.com/josegonzalez/cakephp-upload с большим успехом в нашем производстве приложение, и сделал это в течение достаточно долгого времени.

Имеет отличную поддержку для использования «Flysystem» (https://flysystem.thephpleague.com/) - это абстракции из определенных файловых систем (систем), поэтому переход от обычной локальной файловой системы к S3 - это не просто или Dropbox, хочу :-)

Вы можете найти соответствующие (высококачественные) плагины для загрузки файлов прямо здесь: https://github.com/FriendsOfCake/awesome-cakephp#files - Я также использовал «Proffer», и это ни в коем случае не «почти сделано» или что-то похожее - у меня есть все мои рекомендации, и я наготове готов!

Смежные вопросы