Creating a file upload template in Doctrine ORM
Posted
by balupton
on Stack Overflow
See other posts from Stack Overflow
or by balupton
Published on 2009-11-08T09:11:00Z
Indexed on
2010/03/14
21:35 UTC
Read the original article
Hit count: 250
Hey all.
I'm using Doctrine 1.2 as my ORM for a Zend Framework Project. I have defined the following Model for a File.
File:
columns:
id:
primary: true
type: integer(4)
unsigned: true
code:
type: string(255)
unique: true
notblank: true
path:
type: string(255)
notblank: true
size:
type: integer(4)
type:
type: enum
values: [file,document,image,video,audio,web,application,archive]
default: unknown
notnull: true
mimetype:
type: string(20)
notnull: true
width:
type: integer(2)
unsigned: true
height:
type: integer(2)
unsigned: true
Now here is the File Model php class (just skim through for now):
<?php
/**
* File
*
* This class has been auto-generated by the Doctrine ORM Framework
*
* @package ##PACKAGE##
* @subpackage ##SUBPACKAGE##
* @author ##NAME## <##EMAIL##>
* @version SVN: $Id: Builder.php 6365 2009-09-15 18:22:38Z jwage $
*/
class File extends BaseFile {
public function setUp ( ) {
$this->hasMutator('file', 'setFile');
parent::setUp();
}
public function setFile ( $file ) {
global $Application;
// Configuration
$config = array();
$config['bal'] = $Application->getOption('bal');
// Check the file
if ( !empty($file['error']) ) {
$error = $file['error'];
switch ( $file['error'] ) {
case UPLOAD_ERR_INI_SIZE :
$error = 'ini_size';
break;
case UPLOAD_ERR_FORM_SIZE :
$error = 'form_size';
break;
case UPLOAD_ERR_PARTIAL :
$error = 'partial';
break;
case UPLOAD_ERR_NO_FILE :
$error = 'no_file';
break;
case UPLOAD_ERR_NO_TMP_DIR :
$error = 'no_tmp_dir';
break;
case UPLOAD_ERR_CANT_WRITE :
$error = 'cant_write';
break;
default :
$error = 'unknown';
break;
}
throw new Doctrine_Exception('error-application-file-' . $error);
return false;
}
if ( empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name']) ) {
throw new Doctrine_Exception('error-application-file-invalid');
return false;
}
// Prepare config
$file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;
// Prepare file
$filename = $file['name'];
$file_old_path = $file['tmp_name'];
$file_new_path = $file_upload_path . $filename;
$exist_attempt = 0;
while ( file_exists($file_new_path) ) {
// File already exists
// Pump exist attempts
++$exist_attempt;
// Add the attempt to the end of the file
$file_new_path = $file_upload_path . get_filename($filename,false) . $exist_attempt . get_extension($filename);
}
// Move file
$success = move_uploaded_file($file_old_path, $file_new_path);
if ( !$success ) {
throw new Doctrine_Exception('Unable to upload the file.');
return false;
}
// Secure
$file_path = realpath($file_new_path);
$file_size = filesize($file_path);
$file_mimetype = get_mime_type($file_path);
$file_type = get_filetype($file_path);
// Apply
$this->path = $file_path;
$this->size = $file_size;
$this->mimetype = $file_mimetype;
$this->type = $file_type;
// Apply: Image
if ( $file_type === 'image' ) {
$image_dimensions = image_dimensions($file_path);
if ( !empty($image_dimensions) ) {
// It is not a image we can modify
$this->width = 0;
$this->height = 0;
} else {
$this->width = $image_dimensions['width'];
$this->height = $image_dimensions['height'];
}
}
// Done
return true;
}
/**
* Download the File
* @return
*/
public function download ( ) {
global $Application;
// File path
$file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;
$file_path = $file_upload_path . $this->file_path;
// Output result and download
become_file_download($file_path, null, null);
die();
}
public function postDelete ( $Event ) {
global $Application;
// Prepare
$Invoker = $Event->getInvoker();
// Configuration
$config = array();
$config['bal'] = $Application->getOption('bal');
// File path
$file_upload_path = realpath($config['bal']['files']['upload_path']) . DIRECTORY_SEPARATOR;
$file_path = $file_upload_path . $this->file_path;
// Delete the file
unlink($file_path);
// Done
return true;
}
}
What I am hoping to accomplish is so that the above custom functionality within my model file can be turned into a validator, template, or something along the lines.
So hopefully I can do something like: File: actAs: BalFile: columns: id: primary: true type: integer(4) unsigned: true code: type: string(255) unique: true notblank: true path: type: string(255) notblank: true size: type: integer(4) type: type: enum values: [file,document,image,video,audio,web,application,archive] default: unknown notnull: true mimetype: type: string(20) notnull: true width: type: integer(2) unsigned: true height: type: integer(2) unsigned: true
I'm hoping for a validator so that say if I do
$File->setFile($_FILE['uploaded_file']);
It will provide a validation error, except in all the doctrine documentation it has little on custom validators, especially in the contect of "virtual" fields.
So in summary, my question is: How earth can I go about making a template/extension to porting this functionality? I have tried before with templates but always gave up after a day :/ If you could take the time to port the above I would greatly appreciate it.
© Stack Overflow or respective owner