Increase file size limit from 2 GiB to 4 GiB when workarounds are unavailable.
This commit is contained in:
parent
fb4556033a
commit
0417e52134
|
@ -112,10 +112,7 @@ if (\OC_Util::runningOnWindows()) {
|
||||||
$fullPath = $this->datadir . $path;
|
$fullPath = $this->datadir . $path;
|
||||||
if (PHP_INT_SIZE === 4) {
|
if (PHP_INT_SIZE === 4) {
|
||||||
$helper = new \OC\LargeFileHelper;
|
$helper = new \OC\LargeFileHelper;
|
||||||
$filesize = $helper->getFilesize($fullPath);
|
return $helper->getFilesize($fullPath);
|
||||||
if (!is_null($filesize)) {
|
|
||||||
return $filesize;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return filesize($fullPath);
|
return filesize($fullPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,10 +134,7 @@ class MappedLocal extends \OC\Files\Storage\Common {
|
||||||
$fullPath = $this->buildPath($path);
|
$fullPath = $this->buildPath($path);
|
||||||
if (PHP_INT_SIZE === 4) {
|
if (PHP_INT_SIZE === 4) {
|
||||||
$helper = new \OC\LargeFileHelper;
|
$helper = new \OC\LargeFileHelper;
|
||||||
$filesize = $helper->getFilesize($fullPath);
|
return $helper->getFilesize($fullPath);
|
||||||
if (!is_null($filesize)) {
|
|
||||||
return $filesize;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return filesize($fullPath);
|
return filesize($fullPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ class LargeFileHelper {
|
||||||
if (!is_null($filesize)) {
|
if (!is_null($filesize)) {
|
||||||
return $filesize;
|
return $filesize;
|
||||||
}
|
}
|
||||||
return null;
|
return $this->getFilesizeNative($filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -159,6 +159,27 @@ class LargeFileHelper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the filesize via a filesize() call and converts negative
|
||||||
|
* signed int to positive float. As the result of filesize() will
|
||||||
|
* wrap around after a filesize of 2^32 bytes = 4 GiB, this should
|
||||||
|
* only be used as a last resort.
|
||||||
|
*
|
||||||
|
* @param string $filename Path to the file.
|
||||||
|
*
|
||||||
|
* @return int|float Number of bytes as number (float or int).
|
||||||
|
*/
|
||||||
|
public function getFilesizeNative($filename) {
|
||||||
|
$result = filesize($filename);
|
||||||
|
if ($result < 0) {
|
||||||
|
// For filesizes between 2 GiB and 4 GiB, filesize() will return a
|
||||||
|
// negative int, as the PHP data type int is signed. Interpret the
|
||||||
|
// returned int as an unsigned integer and put it into a float.
|
||||||
|
return (float) sprintf('%u', $result);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
protected function exec($cmd) {
|
protected function exec($cmd) {
|
||||||
$result = trim(exec($cmd));
|
$result = trim(exec($cmd));
|
||||||
return ctype_digit($result) ? 0 + $result : null;
|
return ctype_digit($result) ? 0 + $result : null;
|
||||||
|
|
|
@ -59,4 +59,11 @@ class LargeFileHelperGetFilesize extends \PHPUnit_Framework_TestCase {
|
||||||
$this->helper->getFilesizeViaExec($this->filename)
|
$this->helper->getFilesizeViaExec($this->filename)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetFilesizeNative() {
|
||||||
|
$this->assertSame(
|
||||||
|
$this->filesize,
|
||||||
|
$this->helper->getFilesizeNative($this->filename)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue