web-dev-qa-db-ja.com

画像をアップロードするCakePHP 3.0

Cakephp 3.0アプリに画像をアップロードしたい。しかし、私はエラーメッセージを受け取ります:

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

CakePHP 3.0でファイル(一度に複数のファイル)をアップロードするためのいくつかの例はすでにありますか? CakePHP 2.xの例しか見つけられないからです!

ImagesTable.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']);
    }

Image add.ctp

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

画像エンティティ

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

たぶん、以下が役に立ちます。それはあなたがファイルを非常に簡単にアップロードするのを助ける行動です!

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

苦労している場合はお知らせください。

グリーツ

2
Bob

あなたのビューファイルに、私の場合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-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.');
   }
}

これを使用する前に、webrootupload/avatarという名前のフォルダーを作成します。

注:input( 'Name Here')は、

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

配列の結果を見たい場合は、それを印刷できます。

CakePHP 3.xのチャームのように機能します

誰もがここで彼のプラグインの広告を作成したので、これもやってみましょう。私は他の質問にリンクされているUploadable動作を確認しましたが、それはかなり単純で半分は完了しているようです。

エンタープライズレベルで拡張できる完全なソリューションが必要な場合は、 FileStorage outを確認してください。 really多くのファイル。 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);
    }
}
1
burzum

私たちは https://github.com/josegonzalez/cakephp-upload を使用しており、製品版アプリで大成功を収めています。

"Flysystem"( https://flysystem.thephpleague.com/ )を使用するための素晴らしいサポートもあります-これは特定のファイルシステムからの抽象化です-通常のローカルファイルシステムからS3に移動します非常に簡単です、またはDropboxまたはあなたが望むどんな場所でもあります:-)

ファイルのアップロードに関連する(高品質の)プラグインは、ここにあります: https://github.com/FriendsOfCake/awesome-cakephp#files -「Proffer」を使用して成功しましたそして、それは決して「ほぼ完了」または同様のものではありません-どちらも私のすべての推奨事項を備えており、私の生産の準備ができています!

0
Spriz
<?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);
                }
            }
        }
    }
}
0
Erdi
/*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
Aub Busta