aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/filestore.php
diff options
context:
space:
mode:
authorbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>2009-10-15 04:41:46 +0000
committerbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>2009-10-15 04:41:46 +0000
commit54a3c3e7e9e70c4770010e442e95f734200d03f9 (patch)
treef8e2e7e383523bbf28654ec171e57c841ed1910b /engine/lib/filestore.php
parentba331497c03a51ae4b46b387e5f6773620a98cff (diff)
downloadelgg-54a3c3e7e9e70c4770010e442e95f734200d03f9.tar.gz
elgg-54a3c3e7e9e70c4770010e442e95f734200d03f9.tar.bz2
Standardized gobs of files.
git-svn-id: http://code.elgg.org/elgg/trunk@3548 36083f99-b078-4883-b0ff-0f9b5a30f544
Diffstat (limited to 'engine/lib/filestore.php')
-rw-r--r--engine/lib/filestore.php2465
1 files changed, 1219 insertions, 1246 deletions
diff --git a/engine/lib/filestore.php b/engine/lib/filestore.php
index a7df5a8f0..852fbae8f 100644
--- a/engine/lib/filestore.php
+++ b/engine/lib/filestore.php
@@ -1,1346 +1,1319 @@
<?php
+/**
+ * Elgg filestore.
+ * This file contains classes, interfaces and functions for saving and retrieving data to various file
+ * stores.
+ *
+ * @package Elgg
+ * @subpackage API
+ * @author Curverider Ltd
+ * @link http://elgg.org/
+ */
+
+include_once("objects.php");
+
+/**
+ * @class ElggFilestore
+ * This class defines the interface for all elgg data repositories.
+ * @author Curverider Ltd
+ */
+abstract class ElggFilestore {
/**
- * Elgg filestore.
- * This file contains classes, interfaces and functions for saving and retrieving data to various file
- * stores.
- *
- * @package Elgg
- * @subpackage API
- * @author Curverider Ltd
- * @link http://elgg.org/
+ * Attempt to open the file $file for storage or writing.
+ *
+ * @param ElggFile $file
+ * @param string $mode "read", "write", "append"
+ * @return mixed A handle to the opened file or false on error.
*/
+ abstract public function open(ElggFile $file, $mode);
- include_once("objects.php");
-
/**
- * @class ElggFilestore
- * This class defines the interface for all elgg data repositories.
- * @author Curverider Ltd
+ * Write data to a given file handle.
+ *
+ * @param mixed $f The file handle - exactly what this is depends on the file system
+ * @param string $data The binary string of data to write
+ * @return int Number of bytes written.
*/
- abstract class ElggFilestore
- {
- /**
- * Attempt to open the file $file for storage or writing.
- *
- * @param ElggFile $file
- * @param string $mode "read", "write", "append"
- * @return mixed A handle to the opened file or false on error.
- */
- abstract public function open(ElggFile $file, $mode);
-
- /**
- * Write data to a given file handle.
- *
- * @param mixed $f The file handle - exactly what this is depends on the file system
- * @param string $data The binary string of data to write
- * @return int Number of bytes written.
- */
- abstract public function write($f, $data);
-
- /**
- * Read data from a filestore.
- *
- * @param mixed $f The file handle
- * @param int $length Length in bytes to read.
- * @param int $offset The optional offset.
- * @return mixed String of data or false on error.
- */
- abstract public function read($f, $length, $offset = 0);
-
- /**
- * Seek a given position within a file handle.
- *
- * @param mixed $f The file handle.
- * @param int $position The position.
- */
- abstract public function seek($f, $position);
-
- /**
- * Return a whether the end of a file has been reached.
- *
- * @param mixed $f The file handle.
- * @return boolean
- */
- abstract public function eof($f);
-
- /**
- * Return the current position in an open file.
- *
- * @param mixed $f The file handle.
- * @return int
- */
- abstract public function tell($f);
-
- /**
- * Close a given file handle.
- *
- * @param mixed $f
- */
- abstract public function close($f);
-
- /**
- * Delete the file associated with a given file handle.
- *
- * @param ElggFile $file
- */
- abstract public function delete(ElggFile $file);
-
- /**
- * Return the size in bytes for a given file.
- *
- * @param ElggFile $file
- */
- abstract public function getFileSize(ElggFile $file);
-
- /**
- * Return the filename of a given file as stored on the filestore.
- *
- * @param ElggFile $file
- */
- abstract public function getFilenameOnFilestore(ElggFile $file);
-
- /**
- * Get the filestore's creation parameters as an associative array.
- * Used for serialisation and for storing the creation details along side a file object.
- *
- * @return array
- */
- abstract public function getParameters();
-
- /**
- * Set the parameters from the associative array produced by $this->getParameters().
- */
- abstract public function setParameters(array $parameters);
-
- /**
- * Get the contents of the whole file.
- *
- * @param mixed $file The file handle.
- * @return mixed The file contents.
- */
- abstract public function grabFile(ElggFile $file);
-
- /**
- * Return whether a file physically exists or not.
- *
- * @param ElggFile $file
- */
- abstract public function exists(ElggFile $file);
-
- }
-
+ abstract public function write($f, $data);
+
/**
- * @class ElggDiskFilestore
- * This class uses disk storage to save data.
- * @author Curverider Ltd
+ * Read data from a filestore.
+ *
+ * @param mixed $f The file handle
+ * @param int $length Length in bytes to read.
+ * @param int $offset The optional offset.
+ * @return mixed String of data or false on error.
*/
- class ElggDiskFilestore extends ElggFilestore
- {
- /**
- * Directory root.
- */
- private $dir_root;
-
- /**
- * Default depth of file directory matrix
- */
- private $matrix_depth = 5;
-
- /**
- * Construct a disk filestore using the given directory root.
- *
- * @param string $directory_root Root directory, must end in "/"
- */
- public function __construct($directory_root = "")
- {
- global $CONFIG;
-
- if ($directory_root)
- $this->dir_root = $directory_root;
- else
- $this->dir_root = $CONFIG->dataroot;
- }
-
- public function open(ElggFile $file, $mode)
- {
- $fullname = $this->getFilenameOnFilestore($file);
-
- // Split into path and name
- $ls = strrpos($fullname,"/");
- if ($ls===false) $ls = 0;
-
- $path = substr($fullname, 0, $ls);
- $name = substr($fullname, $ls);
-
- // Try and create the directory
- try { $this->make_directory_root($path); } catch (Exception $e){}
-
- if (($mode!='write') && (!file_exists($fullname)))
- return false;
-
- switch ($mode)
- {
- case "read" : $mode = "r+b"; break;
- case "write" : $mode = "w+b"; break;
- case "append" : $mode = "a+b"; break;
- default: throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:UnrecognisedFileMode'), $mode));
- }
-
- return fopen($fullname, $mode);
-
- }
-
- public function write($f, $data)
- {
- return fwrite($f, $data);
- }
-
- public function read($f, $length, $offset = 0)
- {
- if ($offset)
- $this->seek($f, $offset);
-
- return fread($f, $length);
- }
-
- public function close($f)
- {
- return fclose($f);
- }
-
- public function delete(ElggFile $file)
- {
- $filename = $this->getFilenameOnFilestore($file);
- if (file_exists($filename)) {
- return unlink($filename);
- } else {
- return true;
- }
- }
-
- public function seek($f, $position)
- {
- return fseek($f, $position);
- }
-
- public function tell($f)
- {
- return ftell($f);
- }
-
- public function eof($f)
- {
- return feof($f);
+ abstract public function read($f, $length, $offset = 0);
+
+ /**
+ * Seek a given position within a file handle.
+ *
+ * @param mixed $f The file handle.
+ * @param int $position The position.
+ */
+ abstract public function seek($f, $position);
+
+ /**
+ * Return a whether the end of a file has been reached.
+ *
+ * @param mixed $f The file handle.
+ * @return boolean
+ */
+ abstract public function eof($f);
+
+ /**
+ * Return the current position in an open file.
+ *
+ * @param mixed $f The file handle.
+ * @return int
+ */
+ abstract public function tell($f);
+
+ /**
+ * Close a given file handle.
+ *
+ * @param mixed $f
+ */
+ abstract public function close($f);
+
+ /**
+ * Delete the file associated with a given file handle.
+ *
+ * @param ElggFile $file
+ */
+ abstract public function delete(ElggFile $file);
+
+ /**
+ * Return the size in bytes for a given file.
+ *
+ * @param ElggFile $file
+ */
+ abstract public function getFileSize(ElggFile $file);
+
+ /**
+ * Return the filename of a given file as stored on the filestore.
+ *
+ * @param ElggFile $file
+ */
+ abstract public function getFilenameOnFilestore(ElggFile $file);
+
+ /**
+ * Get the filestore's creation parameters as an associative array.
+ * Used for serialisation and for storing the creation details along side a file object.
+ *
+ * @return array
+ */
+ abstract public function getParameters();
+
+ /**
+ * Set the parameters from the associative array produced by $this->getParameters().
+ */
+ abstract public function setParameters(array $parameters);
+
+ /**
+ * Get the contents of the whole file.
+ *
+ * @param mixed $file The file handle.
+ * @return mixed The file contents.
+ */
+ abstract public function grabFile(ElggFile $file);
+
+ /**
+ * Return whether a file physically exists or not.
+ *
+ * @param ElggFile $file
+ */
+ abstract public function exists(ElggFile $file);
+}
+
+/**
+ * @class ElggDiskFilestore
+ * This class uses disk storage to save data.
+ * @author Curverider Ltd
+ */
+class ElggDiskFilestore extends ElggFilestore {
+ /**
+ * Directory root.
+ */
+ private $dir_root;
+
+ /**
+ * Default depth of file directory matrix
+ */
+ private $matrix_depth = 5;
+
+ /**
+ * Construct a disk filestore using the given directory root.
+ *
+ * @param string $directory_root Root directory, must end in "/"
+ */
+ public function __construct($directory_root = "") {
+ global $CONFIG;
+
+ if ($directory_root) {
+ $this->dir_root = $directory_root;
+ } else {
+ $this->dir_root = $CONFIG->dataroot;
}
-
- public function getFileSize(ElggFile $file)
- {
- return filesize($this->getFilenameOnFilestore($file));
+ }
+
+ public function open(ElggFile $file, $mode) {
+ $fullname = $this->getFilenameOnFilestore($file);
+
+ // Split into path and name
+ $ls = strrpos($fullname,"/");
+ if ($ls===false) {
+ $ls = 0;
}
-
- public function getFilenameOnFilestore(ElggFile $file)
- {
- $owner = $file->getOwnerEntity();
- if (!$owner)
- $owner = get_loggedin_user();
-
- if ((!$owner) || (!$owner->username)) throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:MissingOwner'), $file->getFilename(), $file->guid));
-
- return $this->dir_root . $this->make_file_matrix($owner->username) . $file->getFilename();
+
+ $path = substr($fullname, 0, $ls);
+ $name = substr($fullname, $ls);
+
+ // Try and create the directory
+ try {
+ $this->make_directory_root($path);
+ } catch (Exception $e) {
+
}
-
- public function grabFile(ElggFile $file) {
-
- return file_get_contents($file->getFilenameOnFilestore());
-
+
+ if (($mode!='write') && (!file_exists($fullname))) {
+ return false;
}
-
- public function exists(ElggFile $file)
- {
- return file_exists($this->getFilenameOnFilestore($file));
+
+ switch ($mode) {
+ case "read" :
+ $mode = "r+b";
+ break;
+ case "write" :
+ $mode = "w+b";
+ break;
+ case "append" :
+ $mode = "a+b";
+ break;
+ default:
+ throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:UnrecognisedFileMode'), $mode));
}
-
- public function getSize($prefix,$container_guid) {
- if ($container_guid && ($container=get_entity($container_guid)) && ($username = $container->username)) {
- return get_dir_size($this->dir_root.$this->make_file_matrix($username).$prefix);
- } else {
- return false;
- }
+
+ return fopen($fullname, $mode);
+
+ }
+
+ public function write($f, $data) {
+ return fwrite($f, $data);
+ }
+
+ public function read($f, $length, $offset = 0) {
+ if ($offset) {
+ $this->seek($f, $offset);
}
-
- /**
- * Make the directory root.
- *
- * @param string $dirroot
- */
- protected function make_directory_root($dirroot)
- {
- if (!file_exists($dirroot))
- if (!@mkdir($dirroot, 0700, true))
- throw new IOException(sprintf(elgg_echo('IOException:CouldNotMake'), $dirroot));
-
+
+ return fread($f, $length);
+ }
+
+ public function close($f) {
+ return fclose($f);
+ }
+
+ public function delete(ElggFile $file) {
+ $filename = $this->getFilenameOnFilestore($file);
+ if (file_exists($filename)) {
+ return unlink($filename);
+ } else {
return true;
}
-
- /**
- * Multibyte string tokeniser.
- *
- * Splits a string into an array. Will fail safely if mbstring is not installed (although this may still
- * not handle .
- *
- * @param string $string String
- * @param string $charset The charset, defaults to UTF8
- * @return array
- */
- private function mb_str_split($string, $charset = 'UTF8')
- {
- if (is_callable('mb_substr'))
- {
- $length = mb_strlen($string);
- $array = array();
-
- while ($length)
- {
- $array[] = mb_substr($string, 0, 1, $charset);
- $string = mb_substr($string, 1, $length, $charset);
-
- $length = mb_strlen($string);
- }
-
- return $array;
- }
- else
- return str_split($string);
-
- return false;
- }
-
- /**
- * Construct the filename matrix.
- *
- * @param string $filename
- */
- protected function make_file_matrix($filename)
- {
- $invalid_fs_chars = '*\'\\/"!$%^&*.%(){}[]#~?<>;|¬`@-+=';
-
- $matrix = "";
-
- $name = $filename;
- $filename = $this->mb_str_split($filename);
- if (!$filename) return false;
-
- $len = count($filename);
- if ($len>$this->matrix_depth)
- $len = $this->matrix_depth;
-
- for ($n = 0; $n < $len; $n++) {
-
- // Prevent a matrix being formed with unsafe characters
- $char = $filename[$n];
- if (strpos($invalid_fs_chars, $char)!==false)
- $char = '_';
-
- $matrix .= $char . "/";
- }
-
- return $matrix.$name."/";
+ }
+
+ public function seek($f, $position) {
+ return fseek($f, $position);
+ }
+
+ public function tell($f) {
+ return ftell($f);
+ }
+
+ public function eof($f) {
+ return feof($f);
+ }
+
+ public function getFileSize(ElggFile $file) {
+ return filesize($this->getFilenameOnFilestore($file));
+ }
+
+ public function getFilenameOnFilestore(ElggFile $file) {
+ $owner = $file->getOwnerEntity();
+ if (!$owner) {
+ $owner = get_loggedin_user();
}
-
- public function getParameters()
- {
- return array("dir_root" => $this->dir_root);
+
+ if ((!$owner) || (!$owner->username)) {
+ throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:MissingOwner'), $file->getFilename(), $file->guid));
}
-
- public function setParameters(array $parameters)
- {
- if (isset($parameters['dir_root']))
- {
- $this->dir_root = $parameters['dir_root'];
- return true;
- }
-
+
+ return $this->dir_root . $this->make_file_matrix($owner->username) . $file->getFilename();
+ }
+
+ public function grabFile(ElggFile $file) {
+ return file_get_contents($file->getFilenameOnFilestore());
+ }
+
+ public function exists(ElggFile $file) {
+ return file_exists($this->getFilenameOnFilestore($file));
+ }
+
+ public function getSize($prefix,$container_guid) {
+ if ($container_guid && ($container=get_entity($container_guid)) && ($username = $container->username)) {
+ return get_dir_size($this->dir_root.$this->make_file_matrix($username).$prefix);
+ } else {
return false;
}
}
-
+
/**
- * @class ElggFile
- * This class represents a physical file.
- *
- * Usage:
- * Create a new ElggFile object and specify a filename, and optionally a FileStore (if one isn't specified
- * then the default is assumed.
- *
- * Open the file using the appropriate mode, and you will be able to read and write to the file.
- *
- * Optionally, you can also call the file's save() method, this will turn the file into an entity in the
- * system and permit you to do things like attach tags to the file etc. This is not done automatically since
- * there are many occasions where you may want access to file data on datastores using the ElggFile interface
- * but do not want to create an Entity reference to it in the system (temporary files for example).
- *
- * @author Curverider Ltd
+ * Make the directory root.
+ *
+ * @param string $dirroot
*/
- class ElggFile extends ElggObject
- {
- /** Filestore */
- private $filestore;
-
- /** File handle used to identify this file in a filestore. Created by open. */
- private $handle;
-
- protected function initialise_attributes()
- {
- parent::initialise_attributes();
-
- $this->attributes['subtype'] = "file";
- }
-
- public function __construct($guid = null)
- {
- parent::__construct($guid);
-
- // Set default filestore
- $this->filestore = $this->getFilestore();
- }
-
- /**
- * Set the filename of this file.
- *
- * @param string $name The filename.
- */
- public function setFilename($name) { $this->filename = $name; }
-
- /**
- * Return the filename.
- */
- public function getFilename() { return $this->filename; }
-
- /**
- * Return the filename of this file as it is/will be stored on the filestore, which may be different
- * to the filename.
- */
- public function getFilenameOnFilestore() { return $this->filestore->getFilenameOnFilestore($this); }
-
- /*
- * Return the size of the filestore associated with this file
- *
- */
- public function getFilestoreSize($prefix='',$container_guid=0) {
- if (!$container_guid) {
- $container_guid = $this->container_guid;
- }
- $fs = $this->getFilestore();
- return $fs->getSize($prefix,$container_guid);
- }
-
- /**
- * Get the mime type of the file.
- */
- public function getMimeType()
- {
- if ($this->mimetype)
- return $this->mimetype;
-
- // TODO : Guess mimetype if not here
- }
-
- /**
- * Set the mime type of the file.
- *
- * @param $mimetype The mimetype
- */
- public function setMimeType($mimetype) { return $this->mimetype = $mimetype; }
-
- /**
- * Set the optional file description.
- *
- * @param string $description The description.
- */
- public function setDescription($description) { $this->description = $description; }
-
- /**
- * Open the file with the given mode
- *
- * @param string $mode Either read/write/append
- */
- public function open($mode)
- {
- if (!$this->getFilename())
- throw new IOException(elgg_echo('IOException:MissingFileName'));
-
- // See if file has already been saved
- // seek on datastore, parameters and name?
-
- // Sanity check
- if (
- ($mode!="read") &&
- ($mode!="write") &&
- ($mode!="append")
- )
- throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:UnrecognisedFileMode'), $mode));
-
- // Get the filestore
- $fs = $this->getFilestore();
-
- // Ensure that we save the file details to object store
- //$this->save();
-
- // Open the file handle
- $this->handle = $fs->open($this, $mode);
-
- return $this->handle;
- }
-
- /**
- * Write some data.
- *
- * @param string $data The data
- */
- public function write($data)
- {
- $fs = $this->getFilestore();
-
- return $fs->write($this->handle, $data);
- }
-
- /**
- * Read some data.
- *
- * @param int $length Amount to read.
- * @param int $offset The offset to start from.
- */
- public function read($length, $offset = 0)
- {
- $fs = $this->getFilestore();
-
- return $fs->read($this->handle, $length, $offset);
- }
-
- /**
- * Gets the full contents of this file.
- *
- * @return mixed The file contents.
- */
- public function grabFile() {
-
- $fs = $this->getFilestore();
- return $fs->grabFile($this);
-
- }
-
- /**
- * Close the file and commit changes
- */
- public function close()
- {
- $fs = $this->getFilestore();
-
- if ($fs->close($this->handle))
- {
- $this->handle = NULL;
-
- return true;
+ protected function make_directory_root($dirroot) {
+ if (!file_exists($dirroot)) {
+ if (!@mkdir($dirroot, 0700, true)) {
+ throw new IOException(sprintf(elgg_echo('IOException:CouldNotMake'), $dirroot));
}
-
- return false;
}
-
- /**
- * Delete this file.
- */
- public function delete()
- {
- $fs = $this->getFilestore();
- if ($fs->delete($this)) {
- return parent::delete();
+
+ return true;
+ }
+
+ /**
+ * Multibyte string tokeniser.
+ *
+ * Splits a string into an array. Will fail safely if mbstring is not installed (although this may still
+ * not handle .
+ *
+ * @param string $string String
+ * @param string $charset The charset, defaults to UTF8
+ * @return array
+ */
+ private function mb_str_split($string, $charset = 'UTF8') {
+ if (is_callable('mb_substr')) {
+ $length = mb_strlen($string);
+ $array = array();
+
+ while ($length) {
+ $array[] = mb_substr($string, 0, 1, $charset);
+ $string = mb_substr($string, 1, $length, $charset);
+
+ $length = mb_strlen($string);
}
+
+ return $array;
+ } else {
+ return str_split($string);
}
-
- /**
- * Seek a position in the file.
- *
- * @param int $position
- */
- public function seek($position)
- {
- $fs = $this->getFilestore();
-
- return $fs->seek($this->handle, $position);
+
+ return false;
+ }
+
+ /**
+ * Construct the filename matrix.
+ *
+ * @param string $filename
+ */
+ protected function make_file_matrix($filename) {
+ $invalid_fs_chars = '*\'\\/"!$%^&*.%(){}[]#~?<>;|¬`@-+=';
+
+ $matrix = "";
+
+ $name = $filename;
+ $filename = $this->mb_str_split($filename);
+ if (!$filename) {
+ return false;
}
-
- /**
- * Return the current position of the file.
- *
- * @return int The file position
- */
- public function tell()
- {
- $fs = $this->getFilestore();
-
- return $fs->tell($this->handle);
+
+ $len = count($filename);
+ if ($len>$this->matrix_depth) {
+ $len = $this->matrix_depth;
}
-
- /**
- * Return the size of the file in bytes.
- */
- public function size()
- {
- return $this->filestore->getFileSize($this);
+
+ for ($n = 0; $n < $len; $n++) {
+ // Prevent a matrix being formed with unsafe characters
+ $char = $filename[$n];
+ if (strpos($invalid_fs_chars, $char)!==false) {
+ $char = '_';
+ }
+
+ $matrix .= $char . "/";
}
-
- /**
- * Return a boolean value whether the file handle is at the end of the file
- */
- public function eof()
- {
- $fs = $this->getFilestore();
-
- return $fs->eof($this->handle);
+
+ return $matrix.$name."/";
+ }
+
+ public function getParameters() {
+ return array("dir_root" => $this->dir_root);
+ }
+
+ public function setParameters(array $parameters) {
+ if (isset($parameters['dir_root'])) {
+ $this->dir_root = $parameters['dir_root'];
+ return true;
}
-
- public function exists()
- {
- $fs = $this->getFilestore();
-
- return $fs->exists($this);
+
+ return false;
+ }
+}
+
+/**
+ * @class ElggFile
+ * This class represents a physical file.
+ *
+ * Usage:
+ * Create a new ElggFile object and specify a filename, and optionally a FileStore (if one isn't specified
+ * then the default is assumed.
+ *
+ * Open the file using the appropriate mode, and you will be able to read and write to the file.
+ *
+ * Optionally, you can also call the file's save() method, this will turn the file into an entity in the
+ * system and permit you to do things like attach tags to the file etc. This is not done automatically since
+ * there are many occasions where you may want access to file data on datastores using the ElggFile interface
+ * but do not want to create an Entity reference to it in the system (temporary files for example).
+ *
+ * @author Curverider Ltd
+ */
+class ElggFile extends ElggObject {
+ /** Filestore */
+ private $filestore;
+
+ /** File handle used to identify this file in a filestore. Created by open. */
+ private $handle;
+
+ protected function initialise_attributes() {
+ parent::initialise_attributes();
+
+ $this->attributes['subtype'] = "file";
+ }
+
+ public function __construct($guid = null) {
+ parent::__construct($guid);
+
+ // Set default filestore
+ $this->filestore = $this->getFilestore();
+ }
+
+ /**
+ * Set the filename of this file.
+ *
+ * @param string $name The filename.
+ */
+ public function setFilename($name) {
+ $this->filename = $name;
+ }
+
+ /**
+ * Return the filename.
+ */
+ public function getFilename() {
+ return $this->filename;
+ }
+
+ /**
+ * Return the filename of this file as it is/will be stored on the filestore, which may be different
+ * to the filename.
+ */
+ public function getFilenameOnFilestore() {
+ return $this->filestore->getFilenameOnFilestore($this);
+ }
+
+ /*
+ * Return the size of the filestore associated with this file
+ *
+ */
+ public function getFilestoreSize($prefix='',$container_guid=0) {
+ if (!$container_guid) {
+ $container_guid = $this->container_guid;
}
-
- /**
- * Set a filestore.
- *
- * @param ElggFilestore $filestore The file store.
- */
- public function setFilestore(ElggFilestore $filestore)
- {
- $this->filestore = $filestore;
+ $fs = $this->getFilestore();
+ return $fs->getSize($prefix,$container_guid);
+ }
+
+ /**
+ * Get the mime type of the file.
+ */
+ public function getMimeType() {
+ if ($this->mimetype) {
+ return $this->mimetype;
}
-
- /**
- * Return a filestore suitable for saving this file.
- * This filestore is either a pre-registered filestore, a filestore loaded from metatags saved
- * along side this file, or the system default.
- */
- protected function getFilestore()
- {
- // Short circuit if already set.
- if ($this->filestore)
- return $this->filestore;
-
-
- // If filestore meta set then retrieve filestore TODO: Better way of doing this?
- $metas = get_metadata_for_entity($this->guid);
- $parameters = array();
- if (is_array($metas))
- foreach ($metas as $meta)
- {
- if (strpos($meta->name, "filestore::")!==false)
- {
- // Filestore parameter tag
- $comp = explode("::", $meta->name);
- $name = $comp[1];
-
- $parameters[$name] = $meta->value;
- }
- }
-
- // If parameters loaded then create new filestore
- if (count($parameters)!=0)
- {
- // Create new filestore object
- if ((!isset($parameters['filestore'])) || (!class_exists($parameters['filestore'])))
- throw new ClassNotFoundException(elgg_echo('ClassNotFoundException:NotFoundNotSavedWithFile'));
-
- $this->filestore = new $parameters['filestore']();
-
- // Set parameters
- $this->filestore->setParameters($parameters);
- }
-
- // if still nothing then set filestore to default
- if (!$this->filestore)
- $this->filestore = get_default_filestore();
+ // TODO : Guess mimetype if not here
+ }
- return $this->filestore;
+ /**
+ * Set the mime type of the file.
+ *
+ * @param $mimetype The mimetype
+ */
+ public function setMimeType($mimetype) {
+ return $this->mimetype = $mimetype;
+ }
+
+ /**
+ * Set the optional file description.
+ *
+ * @param string $description The description.
+ */
+ public function setDescription($description) {
+ $this->description = $description;
+ }
+
+ /**
+ * Open the file with the given mode
+ *
+ * @param string $mode Either read/write/append
+ */
+ public function open($mode) {
+ if (!$this->getFilename()) {
+ throw new IOException(elgg_echo('IOException:MissingFileName'));
}
-
- public function save()
- {
- if (!parent::save())
- return false;
-
- // Save datastore metadata
- $params = $this->filestore->getParameters();
- foreach ($params as $k => $v)
- $this->setMetaData("filestore::$k", $v);
-
- // Now make a note of the filestore class
- $this->setMetaData("filestore::filestore", get_class($this->filestore));
-
- return true;
+
+ // See if file has already been saved
+ // seek on datastore, parameters and name?
+
+ // Sanity check
+ if (
+ ($mode!="read") &&
+ ($mode!="write") &&
+ ($mode!="append")
+ ) {
+ throw new InvalidParameterException(sprintf(elgg_echo('InvalidParameterException:UnrecognisedFileMode'), $mode));
}
-
+
+ // Get the filestore
+ $fs = $this->getFilestore();
+
+ // Ensure that we save the file details to object store
+ //$this->save();
+
+ // Open the file handle
+ $this->handle = $fs->open($this, $mode);
+
+ return $this->handle;
}
-
+
/**
- * Get the size of the specified directory.
+ * Write some data.
*
- * @param string $dir The full path of the directory
- * @return int The size of the directory.
+ * @param string $data The data
*/
- function get_dir_size($dir,$totalsize = 0){
- $handle = @opendir($dir);
- while ($file = @readdir ($handle)){
- if (eregi("^\.{1,2}$",$file))
- continue;
- if(is_dir($dir.$file)){
- $totalsize = get_dir_size($dir.$file."/",$totalsize);
- } else{
- $totalsize += filesize($dir.$file);
- }
- }
- @closedir($handle);
-
- return($totalsize);
- }
-
+ public function write($data) {
+ $fs = $this->getFilestore();
+
+ return $fs->write($this->handle, $data);
+ }
+
/**
- * Get the contents of an uploaded file.
- * (Returns false if there was an issue.)
+ * Read some data.
*
- * @param string $input_name The name of the file input field on the submission form
- * @return mixed|false The contents of the file, or false on failure.
+ * @param int $length Amount to read.
+ * @param int $offset The offset to start from.
*/
- function get_uploaded_file($input_name) {
-
- // If the file exists ...
- if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
- return file_get_contents($_FILES[$input_name]['tmp_name']);
- }
- return false;
-
+ public function read($length, $offset = 0) {
+ $fs = $this->getFilestore();
+
+ return $fs->read($this->handle, $length, $offset);
}
-
+
/**
- * Gets the jpeg contents of the resized version of an uploaded image
- * (Returns false if the uploaded file was not an image)
+ * Gets the full contents of this file.
*
- * @param string $input_name The name of the file input field on the submission form
- * @param int $maxwidth The maximum width of the resized image
- * @param int $maxheight The maximum height of the resized image
- * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
- * @return false|mixed The contents of the resized image, or false on failure
+ * @return mixed The file contents.
*/
- function get_resized_image_from_uploaded_file($input_name, $maxwidth, $maxheight, $square = false) {
- // If our file exists ...
- if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
-
- return get_resized_image_from_existing_file($_FILES[$input_name]['tmp_name'], $maxwidth, $maxheight, $square);
-
+ public function grabFile() {
+ $fs = $this->getFilestore();
+ return $fs->grabFile($this);
+ }
+
+ /**
+ * Close the file and commit changes
+ */
+ public function close() {
+ $fs = $this->getFilestore();
+
+ if ($fs->close($this->handle)) {
+ $this->handle = NULL;
+
+ return true;
}
-
+
return false;
}
-
+
+ /**
+ * Delete this file.
+ */
+ public function delete() {
+ $fs = $this->getFilestore();
+ if ($fs->delete($this)) {
+ return parent::delete();
+ }
+ }
+
/**
- * Gets the jpeg contents of the resized version of an already uploaded image
- * (Returns false if the uploaded file was not an image)
+ * Seek a position in the file.
*
- * @param string $input_name The name of the file input field on the submission form
- * @param int $maxwidth The maximum width of the resized image
- * @param int $maxheight The maximum height of the resized image
- * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
- * @return false|mixed The contents of the resized image, or false on failure
+ * @param int $position
*/
- function get_resized_image_from_existing_file($input_name, $maxwidth, $maxheight, $square = false, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) {
-
- // Get the size information from the image
- if ($imgsizearray = getimagesize($input_name)) {
-
- // Get width and height
- $width = $imgsizearray[0];
- $height = $imgsizearray[1];
- $newwidth = $width;
- $newheight = $height;
-
- // Square the image dimensions if we're wanting a square image
- if ($square) {
- if ($width < $height) {
- $height = $width;
- } else {
- $width = $height;
+ public function seek($position) {
+ $fs = $this->getFilestore();
+
+ return $fs->seek($this->handle, $position);
+ }
+
+ /**
+ * Return the current position of the file.
+ *
+ * @return int The file position
+ */
+ public function tell() {
+ $fs = $this->getFilestore();
+
+ return $fs->tell($this->handle);
+ }
+
+ /**
+ * Return the size of the file in bytes.
+ */
+ public function size() {
+ return $this->filestore->getFileSize($this);
+ }
+
+ /**
+ * Return a boolean value whether the file handle is at the end of the file
+ */
+ public function eof() {
+ $fs = $this->getFilestore();
+
+ return $fs->eof($this->handle);
+ }
+
+ public function exists() {
+ $fs = $this->getFilestore();
+
+ return $fs->exists($this);
+ }
+
+ /**
+ * Set a filestore.
+ *
+ * @param ElggFilestore $filestore The file store.
+ */
+ public function setFilestore(ElggFilestore $filestore) {
+ $this->filestore = $filestore;
+ }
+
+ /**
+ * Return a filestore suitable for saving this file.
+ * This filestore is either a pre-registered filestore, a filestore loaded from metatags saved
+ * along side this file, or the system default.
+ */
+ protected function getFilestore() {
+ // Short circuit if already set.
+ if ($this->filestore) {
+ return $this->filestore;
+ }
+
+ // If filestore meta set then retrieve filestore TODO: Better way of doing this?
+ $metas = get_metadata_for_entity($this->guid);
+ $parameters = array();
+ if (is_array($metas)) {
+ foreach ($metas as $meta) {
+ if (strpos($meta->name, "filestore::")!==false) {
+ // Filestore parameter tag
+ $comp = explode("::", $meta->name);
+ $name = $comp[1];
+
+ $parameters[$name] = $meta->value;
}
-
- $newwidth = $width;
- $newheight = $height;
-
}
-
- if ($width > $maxwidth) {
- $newheight = floor($height * ($maxwidth / $width));
- $newwidth = $maxwidth;
+ }
+
+ // If parameters loaded then create new filestore
+ if (count($parameters)!=0) {
+ // Create new filestore object
+ if ((!isset($parameters['filestore'])) || (!class_exists($parameters['filestore']))) {
+ throw new ClassNotFoundException(elgg_echo('ClassNotFoundException:NotFoundNotSavedWithFile'));
}
- if ($newheight > $maxheight) {
- $newwidth = floor($newwidth * ($maxheight / $newheight));
- $newheight = $maxheight;
+
+ $this->filestore = new $parameters['filestore']();
+
+ // Set parameters
+ $this->filestore->setParameters($parameters);
+ }
+
+
+ // if still nothing then set filestore to default
+ if (!$this->filestore) {
+ $this->filestore = get_default_filestore();
+ }
+
+ return $this->filestore;
+ }
+
+ public function save() {
+ if (!parent::save()) {
+ return false;
+ }
+
+ // Save datastore metadata
+ $params = $this->filestore->getParameters();
+ foreach ($params as $k => $v) {
+ $this->setMetaData("filestore::$k", $v);
+ }
+
+ // Now make a note of the filestore class
+ $this->setMetaData("filestore::filestore", get_class($this->filestore));
+
+ return true;
+ }
+}
+
+/**
+ * Get the size of the specified directory.
+ *
+ * @param string $dir The full path of the directory
+ * @return int The size of the directory.
+ */
+function get_dir_size($dir, $totalsize = 0){
+ $handle = @opendir($dir);
+ while ($file = @readdir ($handle)){
+ if (eregi("^\.{1,2}$", $file)) {
+ continue;
+ }
+ if(is_dir($dir . $file)) {
+ $totalsize = get_dir_size($dir . $file . "/", $totalsize);
+ } else{
+ $totalsize += filesize($dir . $file);
+ }
+ }
+ @closedir($handle);
+
+ return($totalsize);
+}
+
+/**
+ * Get the contents of an uploaded file.
+ * (Returns false if there was an issue.)
+ *
+ * @param string $input_name The name of the file input field on the submission form
+ * @return mixed|false The contents of the file, or false on failure.
+ */
+function get_uploaded_file($input_name) {
+ // If the file exists ...
+ if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
+ return file_get_contents($_FILES[$input_name]['tmp_name']);
+ }
+ return false;
+}
+
+/**
+ * Gets the jpeg contents of the resized version of an uploaded image
+ * (Returns false if the uploaded file was not an image)
+ *
+ * @param string $input_name The name of the file input field on the submission form
+ * @param int $maxwidth The maximum width of the resized image
+ * @param int $maxheight The maximum height of the resized image
+ * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
+ * @return false|mixed The contents of the resized image, or false on failure
+ */
+function get_resized_image_from_uploaded_file($input_name, $maxwidth, $maxheight, $square = false) {
+ // If our file exists ...
+ if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
+ return get_resized_image_from_existing_file($_FILES[$input_name]['tmp_name'], $maxwidth, $maxheight, $square);
+ }
+
+ return false;
+}
+
+/**
+ * Gets the jpeg contents of the resized version of an already uploaded image
+ * (Returns false if the uploaded file was not an image)
+ *
+ * @param string $input_name The name of the file input field on the submission form
+ * @param int $maxwidth The maximum width of the resized image
+ * @param int $maxheight The maximum height of the resized image
+ * @param true|false $square If set to true, will take the smallest of maxwidth and maxheight and use it to set the dimensions on all size; the image will be cropped.
+ * @return false|mixed The contents of the resized image, or false on failure
+ */
+function get_resized_image_from_existing_file($input_name, $maxwidth, $maxheight, $square = false, $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0) {
+ // Get the size information from the image
+ if ($imgsizearray = getimagesize($input_name)) {
+ // Get width and height
+ $width = $imgsizearray[0];
+ $height = $imgsizearray[1];
+ $newwidth = $width;
+ $newheight = $height;
+
+ // Square the image dimensions if we're wanting a square image
+ if ($square) {
+ if ($width < $height) {
+ $height = $width;
+ } else {
+ $width = $height;
}
-
- $accepted_formats = array(
- 'image/jpeg' => 'jpeg',
- 'image/png' => 'png',
- 'image/gif' => 'gif'
- );
-
- // If it's a file we can manipulate ...
- if (array_key_exists($imgsizearray['mime'],$accepted_formats)) {
-
- $function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
- $newimage = imagecreatetruecolor($newwidth,$newheight);
-
- if (is_callable($function) && $oldimage = $function($input_name)) {
-
- // Crop the image if we need a square
- if ($square) {
- if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
- $widthoffset = floor(($imgsizearray[0] - $width) / 2);
- $heightoffset = floor(($imgsizearray[1] - $height) / 2);
- } else {
- $widthoffset = $x1;
- $heightoffset = $y1;
- $width = ($x2 - $x1);
- $height = $width;
- }
+
+ $newwidth = $width;
+ $newheight = $height;
+ }
+
+ if ($width > $maxwidth) {
+ $newheight = floor($height * ($maxwidth / $width));
+ $newwidth = $maxwidth;
+ }
+
+ if ($newheight > $maxheight) {
+ $newwidth = floor($newwidth * ($maxheight / $newheight));
+ $newheight = $maxheight;
+ }
+
+ $accepted_formats = array(
+ 'image/jpeg' => 'jpeg',
+ 'image/png' => 'png',
+ 'image/gif' => 'gif'
+ );
+
+ // If it's a file we can manipulate ...
+ if (array_key_exists($imgsizearray['mime'],$accepted_formats)) {
+ $function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
+ $newimage = imagecreatetruecolor($newwidth,$newheight);
+
+ if (is_callable($function) && $oldimage = $function($input_name)) {
+ // Crop the image if we need a square
+ if ($square) {
+ if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
+ $widthoffset = floor(($imgsizearray[0] - $width) / 2);
+ $heightoffset = floor(($imgsizearray[1] - $height) / 2);
} else {
- if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
- $widthoffset = 0;
- $heightoffset = 0;
- } else {
- $widthoffset = $x1;
- $heightoffset = $y1;
- $width = ($x2 - $x1);
- $height = ($y2 - $y1);
- }
- }//else {
- // Resize and return the image contents!
- if ($square) {
- $newheight = $maxheight;
- $newwidth = $maxwidth;
- }
- imagecopyresampled($newimage, $oldimage, 0,0,$widthoffset,$heightoffset,$newwidth,$newheight,$width,$height);
- //}
-
- // imagecopyresized($newimage, $oldimage, 0,0,0,0,$newwidth,$newheight,$width,$height);
- ob_start();
- imagejpeg($newimage, null, 90);
- $jpeg = ob_get_clean();
- return $jpeg;
-
- }
-
+ $widthoffset = $x1;
+ $heightoffset = $y1;
+ $width = ($x2 - $x1);
+ $height = $width;
+ }
+ } else {
+ if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 ==0) {
+ $widthoffset = 0;
+ $heightoffset = 0;
+ } else {
+ $widthoffset = $x1;
+ $heightoffset = $y1;
+ $width = ($x2 - $x1);
+ $height = ($y2 - $y1);
+ }
+ }//else {
+ // Resize and return the image contents!
+ if ($square) {
+ $newheight = $maxheight;
+ $newwidth = $maxwidth;
+ }
+ imagecopyresampled($newimage, $oldimage, 0,0,$widthoffset,$heightoffset,$newwidth,$newheight,$width,$height);
+ //}
+
+ // imagecopyresized($newimage, $oldimage, 0,0,0,0,$newwidth,$newheight,$width,$height);
+ ob_start();
+ imagejpeg($newimage, null, 90);
+ $jpeg = ob_get_clean();
+ return $jpeg;
}
-
}
-
- return false;
}
-
-
- // putting these here for now
-
- function file_delete($guid) {
- if ($file = get_entity($guid)) {
-
- if ($file->canEdit()) {
-
- $container = get_entity($file->container_guid);
-
- $thumbnail = $file->thumbnail;
- $smallthumb = $file->smallthumb;
- $largethumb = $file->largethumb;
- if ($thumbnail) {
-
- $delfile = new ElggFile();
- $delfile->owner_guid = $file->owner_guid;
- $delfile->setFilename($thumbnail);
- $delfile->delete();
-
- }
- if ($smallthumb) {
-
- $delfile = new ElggFile();
- $delfile->owner_guid = $file->owner_guid;
- $delfile->setFilename($smallthumb);
- $delfile->delete();
-
- }
- if ($largethumb) {
-
- $delfile = new ElggFile();
- $delfile->owner_guid = $file->owner_guid;
- $delfile->setFilename($largethumb);
- $delfile->delete();
-
- }
-
- return $file->delete();
+
+ return false;
+}
+
+
+// putting these here for now
+
+function file_delete($guid) {
+ if ($file = get_entity($guid)) {
+ if ($file->canEdit()) {
+ $container = get_entity($file->container_guid);
+
+ $thumbnail = $file->thumbnail;
+ $smallthumb = $file->smallthumb;
+ $largethumb = $file->largethumb;
+ if ($thumbnail) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($thumbnail);
+ $delfile->delete();
+ }
+ if ($smallthumb) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($smallthumb);
+ $delfile->delete();
}
+ if ($largethumb) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($largethumb);
+ $delfile->delete();
+ }
+
+ return $file->delete();
}
-
- return false;
}
-
- /**
- * Returns an overall file type from the mimetype
- *
- * @param string $mimetype The MIME type
- * @return string The overall type
- */
- function file_get_general_file_type($mimetype) {
-
- switch($mimetype) {
-
- case "application/msword":
- return "document";
- break;
- case "application/pdf":
- return "document";
- break;
-
- }
-
- if (substr_count($mimetype,'text/'))
+
+ return false;
+}
+
+/**
+ * Returns an overall file type from the mimetype
+ *
+ * @param string $mimetype The MIME type
+ * @return string The overall type
+ */
+function file_get_general_file_type($mimetype) {
+ switch($mimetype) {
+
+ case "application/msword":
return "document";
-
- if (substr_count($mimetype,'audio/'))
- return "audio";
-
- if (substr_count($mimetype,'image/'))
- return "image";
-
- if (substr_count($mimetype,'video/'))
- return "video";
-
- if (substr_count($mimetype,'opendocument'))
- return "document";
-
- return "general";
-
- }
-
- function file_handle_upload($prefix,$subtype,$plugin) {
- $desc = get_input("description");
- $tags = get_input("tags");
- $tags = explode(",", $tags);
- $folder = get_input("folder_text");
- if (!$folder) {
- $folder = get_input("folder_select");
+ break;
+ case "application/pdf":
+ return "document";
+ break;
+ }
+
+ if (substr_count($mimetype,'text/')) {
+ return "document";
+ }
+
+ if (substr_count($mimetype,'audio/')) {
+ return "audio";
+ }
+
+ if (substr_count($mimetype,'image/')) {
+ return "image";
+ }
+
+ if (substr_count($mimetype,'video/')) {
+ return "video";
+ }
+
+ if (substr_count($mimetype,'opendocument')) {
+ return "document";
+ }
+
+ return "general";
+}
+
+function file_handle_upload($prefix,$subtype,$plugin) {
+ $desc = get_input("description");
+ $tags = get_input("tags");
+ $tags = explode(",", $tags);
+ $folder = get_input("folder_text");
+ if (!$folder) {
+ $folder = get_input("folder_select");
+ }
+ $access_id = (int) get_input("access_id");
+ $container_guid = (int) get_input('container_guid', 0);
+ if (!$container_guid) {
+ $container_guid == get_loggedin_userid();
+ }
+
+ // Extract file from, save to default filestore (for now)
+
+ // see if a plugin has set a quota for this user
+ $file_quota = trigger_plugin_hook("$plugin:quotacheck",'user',array('container_guid'=>$container_guid));
+ if (!$file_quota) {
+ // no, see if there is a generic quota set
+ $file_quota = get_plugin_setting('quota', $plugin);
+ }
+ if ($file_quota) {
+ // convert to megabytes
+ $file_quota = $file_quota*1000*1024;
+ }
+
+ // handle uploaded files
+ $number_of_files = get_input('number_of_files',0);
+ $quota_exceeded = false;
+ $bad_mime_type = false;
+
+ for ($i = 0; $i < $number_of_files; $i++) {
+ $title = get_input("title_".$i);
+ $uploaded = $_FILES["upload_".$i];
+ if (!$uploaded || !$uploaded['name']) {
+ // no such file, so skip it
+ continue;
}
- $access_id = (int) get_input("access_id");
- $container_guid = (int) get_input('container_guid', 0);
- if (!$container_guid)
- $container_guid == get_loggedin_userid();
-
- // Extract file from, save to default filestore (for now)
-
- // see if a plugin has set a quota for this user
- $file_quota = trigger_plugin_hook("$plugin:quotacheck",'user',array('container_guid'=>$container_guid));
- if (!$file_quota) {
- // no, see if there is a generic quota set
- $file_quota = get_plugin_setting('quota', $plugin);
+ if ($plugin == "photo") {
+ // do a mime type test
+ if (in_array($uploaded['type'],array('image/jpeg','image/gif','image/png','image/jpg','image/jpe','image/pjpeg','image/x-png'))) {
+ $file = new PhotoPluginFile();
+ } else {
+ $bad_mime_type = true;
+ break;
+ }
+ } else {
+ $file = new FilePluginFile();
}
+ $dir_size = $file->getFilestoreSize($prefix,$container_guid);
+ $filestorename = strtolower(time().$uploaded['name']);
+ $file->setFilename($prefix.$filestorename);
+ $file->setMimeType($uploaded['type']);
+
+ $file->originalfilename = $uploaded['name'];
+
+ $file->subtype = $subtype;
+
+ $file->access_id = $access_id;
+
+ $uf = get_uploaded_file('upload_'.$i);
+
if ($file_quota) {
- // convert to megabytes
- $file_quota = $file_quota*1000*1024;
- }
-
- // handle uploaded files
- $number_of_files = get_input('number_of_files',0);
- $quota_exceeded = false;
- $bad_mime_type = false;
-
- for ($i = 0; $i < $number_of_files; $i++) {
-
- $title = get_input("title_".$i);
- $uploaded = $_FILES["upload_".$i];
- if (!$uploaded || !$uploaded['name']) {
- // no such file, so skip it
- continue;
+ $file_size = strlen($uf);
+ if (($dir_size + $file_size) > $file_quota) {
+ $quota_exceeded = true;
}
- if ($plugin == "photo") {
- // do a mime type test
- if (in_array($uploaded['type'],array('image/jpeg','image/gif','image/png','image/jpg','image/jpe','image/pjpeg','image/x-png'))) {
- $file = new PhotoPluginFile();
- } else {
- $bad_mime_type = true;
- break;
- }
-
- } else {
- $file = new FilePluginFile();
- }
- $dir_size = $file->getFilestoreSize($prefix,$container_guid);
- $filestorename = strtolower(time().$uploaded['name']);
- $file->setFilename($prefix.$filestorename);
- $file->setMimeType($uploaded['type']);
-
- $file->originalfilename = $uploaded['name'];
-
- $file->subtype = $subtype;
-
- $file->access_id = $access_id;
-
- $uf = get_uploaded_file('upload_'.$i);
-
- if ($file_quota) {
- $file_size = strlen($uf);
- if (($dir_size + $file_size) > $file_quota) {
- $quota_exceeded = true;
- }
+ }
+
+ if (!$quota_exceeded) {
+ // all clear, so try to save the data
+
+ $file->open("write");
+ $file->write($uf);
+ $file->close();
+
+ $file->title = $title;
+ $file->description = $desc;
+ if ($container_guid) {
+ $file->container_guid = $container_guid;
}
-
- if (!$quota_exceeded) {
- // all clear, so try to save the data
-
- $file->open("write");
- $file->write($uf);
- $file->close();
-
- $file->title = $title;
- $file->description = $desc;
- if ($container_guid)
- $file->container_guid = $container_guid;
-
- // Save tags
- $file->tags = $tags;
-
- $file->simpletype = file_get_general_file_type($uploaded['type']);
- $file->folder = $folder;
-
- $result = $file->save();
-
- if ($result)
- {
-
- // Generate thumbnail (if image)
- if (substr_count($file->getMimeType(),'image/'))
- {
- $thumbnail = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),60,60, true);
- $thumbsmall = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),153,153, true);
- $thumblarge = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),600,600, false);
- if ($thumbnail) {
- $thumb = new ElggFile();
- $thumb->setMimeType($uploaded['type']);
-
- $thumb->setFilename($prefix."thumb".$filestorename);
- $thumb->open("write");
- $thumb->write($thumbnail);
- $thumb->close();
-
- $file->thumbnail = $prefix."thumb".$filestorename;
-
- $thumb->setFilename($prefix."smallthumb".$filestorename);
- $thumb->open("write");
- $thumb->write($thumbsmall);
- $thumb->close();
- $file->smallthumb = $prefix."smallthumb".$filestorename;
-
- $thumb->setFilename($prefix."largethumb".$filestorename);
- $thumb->open("write");
- $thumb->write($thumblarge);
- $thumb->close();
- $file->largethumb = $prefix."largethumb".$filestorename;
-
- }
+
+ // Save tags
+ $file->tags = $tags;
+
+ $file->simpletype = file_get_general_file_type($uploaded['type']);
+ $file->folder = $folder;
+
+ $result = $file->save();
+
+ if ($result) {
+
+ // Generate thumbnail (if image)
+ if (substr_count($file->getMimeType(),'image/')) {
+ $thumbnail = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),60,60, true);
+ $thumbsmall = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),153,153, true);
+ $thumblarge = get_resized_image_from_existing_file($file->getFilenameOnFilestore(),600,600, false);
+ if ($thumbnail) {
+ $thumb = new ElggFile();
+ $thumb->setMimeType($uploaded['type']);
+
+ $thumb->setFilename($prefix."thumb".$filestorename);
+ $thumb->open("write");
+ $thumb->write($thumbnail);
+ $thumb->close();
+
+ $file->thumbnail = $prefix."thumb".$filestorename;
+
+ $thumb->setFilename($prefix."smallthumb".$filestorename);
+ $thumb->open("write");
+ $thumb->write($thumbsmall);
+ $thumb->close();
+ $file->smallthumb = $prefix."smallthumb".$filestorename;
+
+ $thumb->setFilename($prefix."largethumb".$filestorename);
+ $thumb->open("write");
+ $thumb->write($thumblarge);
+ $thumb->close();
+ $file->largethumb = $prefix."largethumb".$filestorename;
}
-
- // add to this user's file folders
- file_add_to_folders($folder,$container_guid,$plugin);
-
- add_to_river("river/object/$plugin/create",'create',$_SESSION['user']->guid,$file->guid);
- } else {
- break;
}
+
+ // add to this user's file folders
+ file_add_to_folders($folder,$container_guid,$plugin);
+
+ add_to_river("river/object/$plugin/create",'create',$_SESSION['user']->guid,$file->guid);
} else {
break;
}
+ } else {
+ break;
}
-
- if ($quota_exceeded) {
- echo elgg_echo("$plugin:quotaexceeded");
- } else if ($bad_mime_type) {
- echo elgg_echo("$plugin:badmimetype");
- } else if ($result) {
- if ($number_of_files > 1) {
- echo elgg_echo("$plugin:saved_multi");
- } else {
- echo elgg_echo("$plugin:saved");
- }
- } else {
- if ($number_of_files > 1) {
- echo elgg_echo("$plugin:uploadfailed_multi");
- } else {
- echo elgg_echo("$plugin:uploadfailed");
- }
+ }
+
+ if ($quota_exceeded) {
+ echo elgg_echo("$plugin:quotaexceeded");
+ } else if ($bad_mime_type) {
+ echo elgg_echo("$plugin:badmimetype");
+ } else if ($result) {
+ if ($number_of_files > 1) {
+ echo elgg_echo("$plugin:saved_multi");
+ } else {
+ echo elgg_echo("$plugin:saved");
+ }
+ } else {
+ if ($number_of_files > 1) {
+ echo elgg_echo("$plugin:uploadfailed_multi");
+ } else {
+ echo elgg_echo("$plugin:uploadfailed");
}
}
-
- function file_add_to_folders($folder,$container_guid,$plugin) {
- if ($container_guid && ($container = get_entity($container_guid))) {
- $folder_field_name = 'elgg_'.$plugin.'_folders';
- $folders = $container->$folder_field_name;
- if ($folders) {
- if (is_array($folders)) {
- if (!in_array($folder,$folders)) {
- $folders[] = $folder;
- $container->$folder_field_name = $folders;
- }
- } else {
- if ($folders != $folder) {
- $container->$folder_field_name = array($folders,$folder);
- }
+}
+
+function file_add_to_folders($folder,$container_guid,$plugin) {
+ if ($container_guid && ($container = get_entity($container_guid))) {
+ $folder_field_name = 'elgg_'.$plugin.'_folders';
+ $folders = $container->$folder_field_name;
+ if ($folders) {
+ if (is_array($folders)) {
+ if (!in_array($folder,$folders)) {
+ $folders[] = $folder;
+ $container->$folder_field_name = $folders;
+ }
+ } else {
+ if ($folders != $folder) {
+ $container->$folder_field_name = array($folders,$folder);
}
- } else {
- $container->$folder_field_name = $folder;
}
+ } else {
+ $container->$folder_field_name = $folder;
}
}
-
- function file_handle_save($forward,$plugin) {
- // Get variables
- $title = get_input("title");
- $desc = get_input("description");
- $tags = get_input("tags");
- $folder = get_input("folder_text");
- if (!$folder) {
- $folder = get_input("folder_select");
+}
+
+function file_handle_save($forward,$plugin) {
+ // Get variables
+ $title = get_input("title");
+ $desc = get_input("description");
+ $tags = get_input("tags");
+ $folder = get_input("folder_text");
+ if (!$folder) {
+ $folder = get_input("folder_select");
+ }
+ $access_id = (int) get_input("access_id");
+
+ $guid = (int) get_input('file_guid');
+
+ if (!$file = get_entity($guid)) {
+ register_error(elgg_echo("$plugin:uploadfailed"));
+ forward($forward . $_SESSION['user']->username);
+ exit;
+ }
+
+ $result = false;
+
+ $container_guid = $file->container_guid;
+ $container = get_entity($container_guid);
+
+ if ($file->canEdit()) {
+ $file->access_id = $access_id;
+ $file->title = $title;
+ $file->description = $desc;
+ $file->folder = $folder;
+ // add to this user's file folders
+ file_add_to_folders($folder,$container_guid,$plugin);
+
+ // Save tags
+ $tags = explode(",", $tags);
+ $file->tags = $tags;
+
+ $result = $file->save();
+ }
+
+ if ($result) {
+ system_message(elgg_echo("$plugin:saved"));
+ } else {
+ register_error(elgg_echo("$plugin:uploadfailed"));
+ }
+ forward($forward . $container->username);
+}
+
+/**
+ * Manage a file download.
+ *
+ * @param unknown_type $plugin
+ * @param unknown_type $file_guid If not specified then file_guid will be found in input.
+ */
+function file_manage_download($plugin, $file_guid = "") {
+ // Get the guid
+ $file_guid = (int)$file_guid;
+
+ if (!$file_guid) {
+ $file_guid = (int)get_input("file_guid");
+ }
+
+ // Get the file
+ $file = get_entity($file_guid);
+
+ if ($file) {
+ $mime = $file->getMimeType();
+ if (!$mime) {
+ $mime = "application/octet-stream";
}
- $access_id = (int) get_input("access_id");
-
- $guid = (int) get_input('file_guid');
-
- if (!$file = get_entity($guid)) {
- register_error(elgg_echo("$plugin:uploadfailed"));
- forward($forward . $_SESSION['user']->username);
- exit;
+
+ $filename = $file->originalfilename;
+
+ header("Content-type: $mime");
+ if (strpos($mime, "image/")!==false) {
+ header("Content-Disposition: inline; filename=\"$filename\"");
+ } else {
+ header("Content-Disposition: attachment; filename=\"$filename\"");
}
-
- $result = false;
-
- $container_guid = $file->container_guid;
- $container = get_entity($container_guid);
-
- if ($file->canEdit()) {
-
- $file->access_id = $access_id;
- $file->title = $title;
- $file->description = $desc;
- $file->folder = $folder;
- // add to this user's file folders
- file_add_to_folders($folder,$container_guid,$plugin);
-
- // Save tags
- $tags = explode(",", $tags);
- $file->tags = $tags;
-
- $result = $file->save();
+
+ echo $file->grabFile();
+ exit;
+ } else {
+ register_error(elgg_echo("$plugin:downloadfailed"));
+ }
+}
+
+/**
+ * Manage the download of a file icon.
+ *
+ * @param unknown_type $plugin
+ * @param unknown_type $file_guid The guid, if not specified this is obtained from the input.
+ */
+function file_manage_icon_download($plugin, $file_guid = "") {
+ // Get the guid
+ $file_guid = (int)$file_guid;
+
+ if (!$file_guid) {
+ $file_guid = (int)get_input("file_guid");
+ }
+
+ // Get the file
+ $file = get_entity($file_guid);
+
+ if ($file) {
+ $mime = $file->getMimeType();
+ if (!$mime) {
+ $mime = "application/octet-stream";
}
-
- if ($result)
- system_message(elgg_echo("$plugin:saved"));
- else
- register_error(elgg_echo("$plugin:uploadfailed"));
-
- forward($forward . $container->username);
- }
-
- /**
- * Manage a file download.
- *
- * @param unknown_type $plugin
- * @param unknown_type $file_guid If not specified then file_guid will be found in input.
- */
- function file_manage_download($plugin, $file_guid = "") {
- // Get the guid
- $file_guid = (int)$file_guid;
-
- if (!$file_guid)
- $file_guid = (int)get_input("file_guid");
-
- // Get the file
- $file = get_entity($file_guid);
-
- if ($file)
- {
- $mime = $file->getMimeType();
- if (!$mime) $mime = "application/octet-stream";
-
- $filename = $file->originalfilename;
-
- header("Content-type: $mime");
- if (strpos($mime, "image/")!==false)
- header("Content-Disposition: inline; filename=\"$filename\"");
- else
- header("Content-Disposition: attachment; filename=\"$filename\"");
-
- echo $file->grabFile();
- exit;
+
+ $filename = $file->thumbnail;
+
+ header("Content-type: $mime");
+ if (strpos($mime, "image/")!==false) {
+ header("Content-Disposition: inline; filename=\"$filename\"");
+ } else {
+ header("Content-Disposition: attachment; filename=\"$filename\"");
}
- else
- register_error(elgg_echo("$plugin:downloadfailed"));
- }
-
- /**
- * Manage the download of a file icon.
- *
- * @param unknown_type $plugin
- * @param unknown_type $file_guid The guid, if not specified this is obtained from the input.
- */
- function file_manage_icon_download($plugin, $file_guid = "") {
- // Get the guid
- $file_guid = (int)$file_guid;
-
- if (!$file_guid)
- $file_guid = (int)get_input("file_guid");
-
- // Get the file
- $file = get_entity($file_guid);
-
- if ($file)
+
+ $readfile = new ElggFile();
+ $readfile->owner_guid = $file->owner_guid;
+ $readfile->setFilename($filename);
+
+ /*
+ if ($file->open("read"));
{
- $mime = $file->getMimeType();
- if (!$mime) $mime = "application/octet-stream";
-
- $filename = $file->thumbnail;
-
- header("Content-type: $mime");
- if (strpos($mime, "image/")!==false)
- header("Content-Disposition: inline; filename=\"$filename\"");
- else
- header("Content-Disposition: attachment; filename=\"$filename\"");
-
-
- $readfile = new ElggFile();
- $readfile->owner_guid = $file->owner_guid;
- $readfile->setFilename($filename);
-
- /*
- if ($file->open("read"));
+ while (!$file->eof())
{
- while (!$file->eof())
- {
- echo $file->read(10240, $file->tell());
- }
+ echo $file->read(10240, $file->tell());
}
- */
-
- $contents = $readfile->grabFile();
- if (empty($contents)) {
- echo file_get_contents(dirname(dirname(__FILE__)) . "/graphics/icons/general.jpg" );
+ }
+ */
+
+ $contents = $readfile->grabFile();
+ if (empty($contents)) {
+ echo file_get_contents(dirname(dirname(__FILE__)) . "/graphics/icons/general.jpg" );
+ } else {
+ echo $contents;
+ }
+ exit;
+ } else {
+ register_error(elgg_echo("$plugin:downloadfailed"));
+ }
+}
+
+function file_display_thumbnail($file_guid,$size) {
+ // Get file entity
+ if ($file = get_entity($file_guid)) {
+ $simpletype = $file->simpletype;
+ if ($simpletype == "image") {
+ // Get file thumbnail
+ if ($size == "small") {
+ $thumbfile = $file->smallthumb;
} else {
+ $thumbfile = $file->largethumb;
+ }
+
+ // Grab the file
+ if ($thumbfile && !empty($thumbfile)) {
+ $readfile = new ElggFile();
+ $readfile->owner_guid = $file->owner_guid;
+ $readfile->setFilename($thumbfile);
+ $mime = $file->getMimeType();
+ $contents = $readfile->grabFile();
+
+ header("Content-type: $mime");
echo $contents;
+ exit;
}
- exit;
- }
- else
- register_error(elgg_echo("$plugin:downloadfailed"));
- }
-
- function file_display_thumbnail($file_guid,$size) {
- // Get file entity
- if ($file = get_entity($file_guid)) {
- $simpletype = $file->simpletype;
- if ($simpletype == "image") {
- // Get file thumbnail
- if ($size == "small") {
- $thumbfile = $file->smallthumb;
- } else {
- $thumbfile = $file->largethumb;
- }
-
- // Grab the file
- if ($thumbfile && !empty($thumbfile)) {
- $readfile = new ElggFile();
- $readfile->owner_guid = $file->owner_guid;
- $readfile->setFilename($thumbfile);
- $mime = $file->getMimeType();
- $contents = $readfile->grabFile();
-
- header("Content-type: $mime");
- echo $contents;
- exit;
-
- }
- }
}
}
-
- function file_set_page_owner($file) {
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
- $container_guid = $file->container_guid;
- if (!empty($container_guid))
- if ($page_owner = get_entity($container_guid)) {
- set_page_owner($page_owner->guid);
- }
- if (empty($page_owner)) {
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
+}
+
+function file_set_page_owner($file) {
+ $page_owner = page_owner_entity();
+ if ($page_owner === false || is_null($page_owner)) {
+ $container_guid = $file->container_guid;
+ if (!empty($container_guid)) {
+ if ($page_owner = get_entity($container_guid)) {
+ set_page_owner($page_owner->guid);
}
}
- }
- /// Variable holding the default datastore
- $DEFAULT_FILE_STORE = NULL;
-
- /**
- * Return the default filestore.
- *
- * @return ElggFilestore
- */
- function get_default_filestore()
- {
- global $DEFAULT_FILE_STORE;
-
- return $DEFAULT_FILE_STORE;
- }
-
- /**
- * Set the default filestore for the system.
- */
- function set_default_filestore(ElggFilestore $filestore)
- {
- global $DEFAULT_FILE_STORE;
-
- $DEFAULT_FILE_STORE = $filestore;
-
- return true;
+ if (empty($page_owner)) {
+ $page_owner = $_SESSION['user'];
+ set_page_owner($_SESSION['guid']);
+ }
}
+}
- /**
- * Run once and only once.
- */
- function filestore_run_once()
- {
- // Register a class
- add_subtype("object", "file", "ElggFile");
- }
-
- /**
- * Initialise the file modules.
- * Listens to system boot and registers any appropriate file types and classes
- */
- function filestore_init()
- {
- global $CONFIG;
-
- // Now register a default filestore
- set_default_filestore(new ElggDiskFilestore($CONFIG->dataroot));
-
- // Now run this stuff, but only once
- run_function_once("filestore_run_once");
- }
-
- // Register a startup event
- register_elgg_event_handler('init','system','filestore_init',100);
-?>
+/// Variable holding the default datastore
+$DEFAULT_FILE_STORE = NULL;
+
+/**
+ * Return the default filestore.
+ *
+ * @return ElggFilestore
+ */
+function get_default_filestore() {
+ global $DEFAULT_FILE_STORE;
+
+ return $DEFAULT_FILE_STORE;
+}
+
+/**
+ * Set the default filestore for the system.
+ */
+function set_default_filestore(ElggFilestore $filestore) {
+ global $DEFAULT_FILE_STORE;
+
+ $DEFAULT_FILE_STORE = $filestore;
+
+ return true;
+}
+
+/**
+ * Run once and only once.
+ */
+function filestore_run_once() {
+ // Register a class
+ add_subtype("object", "file", "ElggFile");
+}
+
+/**
+ * Initialise the file modules.
+ * Listens to system boot and registers any appropriate file types and classes
+ */
+function filestore_init() {
+ global $CONFIG;
+
+ // Now register a default filestore
+ set_default_filestore(new ElggDiskFilestore($CONFIG->dataroot));
+
+ // Now run this stuff, but only once
+ run_function_once("filestore_run_once");
+}
+
+// Register a startup event
+register_elgg_event_handler('init', 'system', 'filestore_init', 100); \ No newline at end of file