brenoroosevelt / cakephp-file-db
Armazena arquivos no Banco - plugin para CakePHP 3.x
Installs: 56
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Type:cakephp-plugin
Requires
- php: >=5.5.9
- cakephp/cakephp: >=3.1 <4.0.0
Requires (Dev)
This package is auto-updated.
Last update: 2021-03-15 22:27:09 UTC
README
Instalação
Recomendamos instalar como um pacote do composer:
"require": { "brenoroosevelt/cakephp-file-db" : "@stable" }
Atualize os pacotes
$ composer update
Carregar o plugin
Adicione no final do arquivo config/bootstrap.php
Plugin::load('FileDb');
Criar a tabela
Usando migrations para gerar a tabela de arquivos
$ bin/cake migrations migrate -p FileDb
Esse comando deve gerar a seguinte tabela. Prefira usar migrations.
CREATE TABLE arquivos ( id serial NOT NULL, file_name character varying(255) NOT NULL, file_path character varying(255), file_type character varying(255) NOT NULL, file_size bigint NOT NULL, file_content bytea NOT NULL, model character varying(255) NOT NULL, tag character varying(255) NOT NULL, foreign_key integer NOT NULL, created timestamp without time zone NOT NULL, modified timestamp without time zone, CONSTRAINT attachments_pkey PRIMARY KEY (id) );
Como Usar
Habilite o behavior em seu Model:
Crie quantas configurações de arquivo desejar:
$this->addBehavior('FileDb.FileDatabase',[ [ 'alias' => 'Foto', 'type' => 'hasOne', 'form_field' => 'file_foto' // campo usado no formulário ], [ 'alias' => 'Documento', 'type' => 'hasOne', 'form_field' => 'file_documento' ], [ 'alias' => 'Album', 'type' => 'hasMany', // hasMany 'form_field' => 'file_album' ], ]);
Adicione o campo no formulário:
<?= $this->Form->create($aluno, ['enctype' => 'multipart/form-data']) ?> <?= $this->Form->file('file_foto'); ?> <?= $this->Form->file('file_documento'); ?> <?= $this->Form->file('file_album.1'); ?> <?= $this->Form->file('file_album.2'); ?> <?= $this->Form->file('file_album.3'); ?> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?>
Obtendo o arquivo:
Em seu controller:
$aluno = $this->Alunos->get($id, [ 'contain' => ['Foto', 'Album', 'Documento' ] ]);
Download do arquivo:
Em seu controller:
public function download($id = null) { // Considere usar um cache antes de fazer a consulta abaixo! $aluno = $this->Alunos->get($id, [ 'contain' => ['Foto'] ]); $file = $aluno->foto->file_content; $this->response->type($aluno->foto->file_type); $this->response->body(function () use ($file) { rewind($file); fpassthru($file); fclose($file); }); $this->response->download($aluno->foto->file_name); // comente para não forçar o download return $this->response; }
Removendo o arquivo:
A remoção é automática quando a entidade associada é removida. Ou seja, se o aluno for removido, os arquivos também serão.
Caso queira remover um arquivo específico ou vários, use o seguinte:
// file_id: id do arquivo! $this->Alunos->deleteFile($file_id); // id: do aluno, e tag = 'Foto' $this->Alunos->deleteAllFiles($id, $tag=null)
Validação
// use bytes(inteiro) ou '1MB' humanizado $validator->add('file_upload', 'file', [ 'rule' => ['fileSize', [ '>', 1024 ]], 'message' =>'Arquivo deve ser maior que 1MB' ]); // limite o tamanho considerandosua regra E: memory_limit, post_max_size e upload_max_filesize $validator->add('file_upload', 'file', [ 'rule' => ['fileSize', [ '<', '2MB' ]], 'message' =>'Arquivo deve ser menor que 2MB' ]); $validator->add('file_upload','create', [ 'rule' => ['extension', ['png', 'pdf']], 'message' =>'Extensão inválida' ]); $validator->add('file_upload','create', [ 'rule' => ['mimeType', ['image/jpeg', 'image/png']], 'message' =>'Tipo inválido', ]); // Erro quando arquivo não pode ser enviado ao servidor, geralmente por causa de: // memory_limit // post_max_size // upload_max_filesize $validator->add('file_upload', 'file', [ 'rule' => ['uploadError'], 'message' =>'Erro ao enviar o arquivo', 'last'=> true ]);
TODO (a fazer)
- Opção de gravar em disco