Merge pull request #1066 from owncloud/fix-388-master

workaround for 32-bit systems to handle filesizes bigger than 2GB
This commit is contained in:
Thomas Müller 2013-01-05 06:21:28 -08:00
commit 0c6213a371
3 changed files with 85 additions and 21 deletions

View File

@ -21,7 +21,7 @@
*/
/**
* Provde a common interface to all different storage options
* Provide a common interface to all different storage options
*/
abstract class OC_Filestorage{
abstract public function __construct($parameters);

View File

@ -29,7 +29,15 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return is_file($this->datadir.$path);
}
public function stat($path) {
return stat($this->datadir.$path);
$fullPath = $this->datadir . $path;
$statResult = stat($fullPath);
if ($statResult['size'] < 0) {
$size = self::getFileSizeFromOS($fullPath);
$statResult['size'] = $size;
$statResult[7] = $size;
}
return $statResult;
}
public function filetype($path) {
$filetype=filetype($this->datadir.$path);
@ -42,7 +50,13 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
if($this->is_dir($path)) {
return 0;
}else{
return filesize($this->datadir.$path);
$fullPath = $this->datadir . $path;
$fileSize = filesize($fullPath);
if ($fileSize < 0) {
return self::getFileSizeFromOS($fullPath);
}
return $fileSize;
}
}
public function isReadable($path) {
@ -156,6 +170,30 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return $return;
}
private static function getFileSizeFromOS($fullPath) {
$name = strtolower(php_uname('s'));
// Windows OS: we use COM to access the filesystem
if (strpos($name, 'win') !== false) {
if (class_exists('COM')) {
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($fullPath);
return $f->Size;
}
} else if (strpos($name, 'bsd') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -f %z ' . escapeshellarg($fullPath));
}
} else if (strpos($name, 'linux') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -c %s ' . escapeshellarg($fullPath));
}
} else {
OC_Log::write('core', 'Unable to determine file size of "'.$fullPath.'". Unknown OS: '.$name, OC_Log::ERROR);
}
return 0;
}
public function hash($path, $type, $raw=false) {
return hash_file($type, $this->datadir.$path, $raw);
}
@ -190,6 +228,7 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
/**
* check if a file or folder has been updated since $time
* @param string $path
* @param int $time
* @return bool
*/

View File

@ -31,8 +31,9 @@ class OC_Helper {
/**
* @brief Creates an url using a defined route
* @param $route
* @param $parameters
* @param $args array with param=>value, will be appended to the returned url
* @param array $parameters
* @return
* @internal param array $args with param=>value, will be appended to the returned url
* @returns the url
*
* Returns a url to the given app and file.
@ -128,6 +129,7 @@ class OC_Helper {
/**
* @brief Creates an absolute url for remote use
* @param string $service id
* @param bool $add_slash
* @return string the url
*
* Returns a absolute url to the given service.
@ -139,6 +141,7 @@ class OC_Helper {
/**
* @brief Creates an absolute url for public use
* @param string $service id
* @param bool $add_slash
* @return string the url
*
* Returns a absolute url to the given service.
@ -450,12 +453,14 @@ class OC_Helper {
}
/**
* detect if a given program is found in the search PATH
*
* @param string $program name
* @param string $optional search path, defaults to $PATH
* @return bool true if executable program found in path
*/
* detect if a given program is found in the search PATH
*
* @param $name
* @param bool $path
* @internal param string $program name
* @internal param string $optional search path, defaults to $PATH
* @return bool true if executable program found in path
*/
public static function canExecute($name, $path = false) {
// path defaults to PATH from environment if not set
if ($path === false) {
@ -676,16 +681,16 @@ class OC_Helper {
}
/**
* @brief replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement.
*
* @param string $input The input string. .Opposite to the PHP build-in function does not accept an array.
* @param string $replacement The replacement string.
* @param int $start If start is positive, the replacing will begin at the start'th offset into string. If start is negative, the replacing will begin at the start'th character from the end of string.
* @param int $length Length of the part to be replaced
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @return string
*
*/
* @brief replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement.
*
* @param $string
* @param string $replacement The replacement string.
* @param int $start If start is positive, the replacing will begin at the start'th offset into string. If start is negative, the replacing will begin at the start'th character from the end of string.
* @param int $length Length of the part to be replaced
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @internal param string $input The input string. .Opposite to the PHP build-in function does not accept an array.
* @return string
*/
public static function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = 'UTF-8') {
$start = intval($start);
$length = intval($length);
@ -758,4 +763,24 @@ class OC_Helper {
}
return $str;
}
/**
* Checks if a function is available
* @param string $function_name
* @return bool
*/
public static function is_function_enabled($function_name) {
if (!function_exists($function_name)) {
return false;
}
$disabled = explode(', ', ini_get('disable_functions'));
if (in_array($function_name, $disabled)) {
return false;
}
$disabled = explode(', ', ini_get('suhosin.executor.func.blacklist'));
if (in_array($function_name, $disabled)) {
return false;
}
return true;
}
}