https://github.com/burzum/cakephp-file-storage/blob/3.0/docs/Tutorials/Quick-Start.md
按照教程,这一切都搞砸了,或者我都搞砸了。
三张桌子产品图片和ProductImages只是想抓住任何有效的东西。
未定义upload.ctp productImage中的第一个错误。嗯,我在控制器中看到它没有设置。老实说,我不知道在添加表单中创建的目的。我知道编辑它会填充数据。
下一个错误当我提交时我得到一个错误ProductTable没有与ProductImages表相关联,你在教程中看到它,它被列为hasMany'Image'。
所以我将其更改为ProductImagesTable
我得到一个错误,上传没有定义,我假设他们是从控制器引用的,并且它被ImageStorageTable继承,我把它改为uploadImage,只是试图不发生错误
我只是想尝试一下如何运作的'hello world'。如果有人可以与我分享一个项目与此工作。我可以解读出了什么问题。
我会分享我的代码,但我只是从快速入门中复制了
答案 0 :(得分:2)
我最近也开始使用CakePHP 3(我也遇到了一些麻烦),首先我使用本地存储然后这将是适当的设置
在文件 bootstrap.php
中C:\ XAMPP \ htdocs中\ [ProjectFolder] \设置\ bootstrap.php中
StorageManager::config('Local', [
'adapterOptions' => [TMP, true],
'adapterClass' => '\Gaufrette\Adapter\Local',
'class' => '\Gaufrette\Filesystem']
);
将此块放在use块下面(记得使用Burzum lib 使用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],
to(不必等于此)
'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)
);
我运行蛋糕烘焙所有产品和蛋糕烘焙所有媒体,结果:
在 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' => '媒体' (我不记得它是否可选,但我把它放在了一起。)
MediasTable.php 与烘焙相同。
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