https://github.com/burzum/cakephp-file-storage/blob/3.0/docs/Tutorials/Quick-Start.md

按照教程,一切都搞砸了,或者我都搞砸了。

三个表 Products Images 和 ProductImages 只是试图捕捉任何工作。

未定义upload.ctp productImage 中的第一个错误。呃,我在 Controller 中看到它没有设置。老实说,我不知道在添加表单中传递它的目的。我知道编辑它会填充数据。

下一个错误 当我提交时,我收到一个错误 ProductTable is not assicated to ProductImages table 你在教程中看到它,它被列为 hasMany 'Images'。

所以我把它改成 ProductImagesTable

我得到一个错误,上传没有定义,我假设它们是从 Controller 引用的,并且它被 ImageStorageTable 继承,我将它更改为 uploadImage 只是为了避免出现错误

我只是想了解一下它是如何工作的。如果有人可以与我分享这个工作的项目。我可以破译什么是错的。

我会分享我的代码,但我只是从快速入门中复制

最佳答案

我最近也开始使用 CakePHP 3(我也遇到了一些麻烦),首先我使用的是 本地存储 那么这将是合适的设置

在文件 bootstrap.php 中


StorageManager::config('Local', [
    'adapterOptions' => [TMP, true],
    'adapterClass' => '\Gaufrette\Adapter\Local',
    'class' => '\Gaufrette\Filesystem']
);

把这个块放在 use 块下面(记得使用 Burzum lib use Burzum\FileStorage\Lib\StorageManager; )
use Burzum\FileStorage\Lib\StorageManager;
use Cake\Cache\Cache;
use Cake\Console\ConsoleErrorHandler;
use Cake\Core\App;
use Cake\Core\Configure;

此行可以根据您的需要进行调整(有文件存储的文件夹)。
'adapterOptions' => [TMP, true],

到(不需要等于这个)
'adapterOptions' => [ROOT . DS . 'PicturesResources' . DS],

这是我在 MySql 中的表(只有两个表 产品 medias 存储图像路径( media_types 对这个例子并不重要))
CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  product_name VARCHAR(255) NOT NULL,
  quantity INT NOT NULL,
  sold INT NOT NULL,
  description VARCHAR(1000),
  price DECIMAL(7,2) NOT NULL,
  old_price DECIMAL(7,2) NOT NULL,
  visited INT NOT NULL,
  status INT NOT NULL,
  created DATETIME,
  modified DATETIME
);

CREATE TABLE media_types (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name_media_type VARCHAR(255) NOT NULL,
  created DATETIME,
  modified DATETIME
);

CREATE TABLE medias (
  id INT AUTO_INCREMENT PRIMARY KEY,
  media_type_id INT NOT NULL,
  product_id INT NOT NULL,
  path VARCHAR(255) NOT NULL,
  created DATETIME,
  modified DATETIME,
  FOREIGN KEY media_type_key (media_type_id) REFERENCES media_types(id),
  FOREIGN KEY product_key (product_id) REFERENCES products(id)
);

我运行 cake bake all products cake bake all medias 结果:

ProductsTable.php
public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('products');
    $this->displayField('id');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
    $this->hasMany('Medias', [
        'className' => 'Medias',
        'foreignKey' => 'product_id'
    ]);
}

我添加 'className' => 'Medias', (我不记得它是否可选,但我把它)。

MediasTable.php 与bake 生成的相同。
public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('medias');
    $this->displayField('id');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
    $this->belongsTo('MediaTypes', [
        'foreignKey' => 'media_type_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('Products', [
        'foreignKey' => 'product_id',
        'joinType' => 'INNER'
    ]);
}

我的 上传方法 ProductsController.php
 public function upload() {

    if ($this->request->is('post')) {
        $mediaTypeId = 1;
        $productId = 2;
        $path = $this->request->data['Media']['file']['tmp_name'];
        $inserted = $this->Insert->insertMedia($mediaTypeId, $productId, $path);

        //-------------------------------------------------------------------------

        $stringSeparator = '_';
        $storeName = 'StoreGYN';
        $productName = 'TestProduct';
        $saved = $this->UploadFile->saveFileLFS($stringSeparator, $storeName,
            $productName);

        if($inserted === true && $saved === true){
            $this->Flash->set(__('Upload successful!'));
        }
    }
}

我把负责 的方法把文件 存储在 组件 中(它是可选的):
public function saveFileLFS($stringSeparator, $storeName, $productName)
{
    $key = $storeName . $stringSeparator . $productName . $stringSeparator .
        $this->request->data['Media']['file']['name'];
    if(StorageManager::adapter('Local')->write($key,
        file_get_contents($this->request->data['Media']['file']['tmp_name']))){
        return true;
    }else
    {
        return false;
    }
}

并将负责 的方法保存图像路径 也放在 组件 中:
public function insertMedia($mediaTypeId, $productId, $path)
{
    $media = TableRegistry::get('Medias')->newEntity();
    $media->media_type_id = $mediaTypeId;
    $media->product_id = $productId;
    $media->path = $path;

    if(TableRegistry::get('Medias')->save($media)){
        return true;
    }
    else{
        return false;
    }
}

这是模板, 注意输入元素名称 它们应该与键 $this->request->data['Media']['file']['tmp_name']; 相同,否则您将无法访问以 形式发送的信息 (包括图像文件)。
<?php
echo $this->Form->create(null, array(
    'type' => 'file'
));
echo $this->Form->file('Media.file');
echo $this->Form->error('file');
echo $this->Form->submit(__('Upload'));
echo $this->Form->end();
?>

注意:我使用的是 XAMPP CakePHP 3

关于php - cakephp-file-storage 快速入门指南,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32031237/

10-12 12:21
查看更多