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']); } не 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' ] ); ?> 

Объект изображения

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

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

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

Дай мне знать, если ты будешь бороться.

Greetz

В вашем файле просмотра добавьте так: в моем случае Users / dashboard.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-tb-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.'); } } 

Прежде чем использовать это, создайте папку в webroot с именем upload / avatar .

Примечание. Вход («Имя здесь») используется в

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

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

Его работы, как очарование в CakePHP 3.x

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

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

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

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

 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); } } 
 /*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); } 
 <?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); } } } } } 

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

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

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