use exceptions for error signaling in writeStream
this remove the ambiguity when writing zero length files Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
b6a600e653
commit
7ac4d57fd5
|
@ -53,6 +53,7 @@ use OC\Files\Storage\Wrapper\Jail;
|
|||
use OC\Files\Storage\Wrapper\Wrapper;
|
||||
use OCP\Files\EmptyFileNameException;
|
||||
use OCP\Files\FileNameTooLongException;
|
||||
use OCP\Files\GenericFileException;
|
||||
use OCP\Files\InvalidCharacterInPathException;
|
||||
use OCP\Files\InvalidDirectoryException;
|
||||
use OCP\Files\InvalidPathException;
|
||||
|
@ -620,10 +621,14 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
|
|||
}
|
||||
} else {
|
||||
$source = $sourceStorage->fopen($sourceInternalPath, 'r');
|
||||
if ($source) {
|
||||
$result = $this->writeStream($targetInternalPath, $source) > 0;
|
||||
} else {
|
||||
$result = false;
|
||||
if ($source) {
|
||||
try {
|
||||
$this->writeStream($targetInternalPath, $source);
|
||||
$result = true;
|
||||
} catch (\Exception $e) {
|
||||
\OC::$server->getLogger()->logException($e, ['level' => ILogger::WARN, 'message' => 'Failed to copy stream to storage']);
|
||||
}
|
||||
}
|
||||
|
||||
if ($result and $preserveMtime) {
|
||||
|
@ -855,10 +860,13 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
|
|||
public function writeStream(string $path, $stream, int $size = null): int {
|
||||
$target = $this->fopen($path, 'w');
|
||||
if (!$target) {
|
||||
return 0;
|
||||
throw new GenericFileException("Failed to open $path for writing");
|
||||
}
|
||||
try {
|
||||
[$count, $result] = \OC_Helper::streamCopy($stream, $target);
|
||||
if (!$result) {
|
||||
throw new GenericFileException("Failed to copy stream");
|
||||
}
|
||||
} finally {
|
||||
fclose($target);
|
||||
fclose($stream);
|
||||
|
|
|
@ -44,6 +44,7 @@ use OC\Files\Filesystem;
|
|||
use OC\Files\Storage\Wrapper\Jail;
|
||||
use OCP\Constants;
|
||||
use OCP\Files\ForbiddenException;
|
||||
use OCP\Files\GenericFileException;
|
||||
use OCP\Files\Storage\IStorage;
|
||||
use OCP\ILogger;
|
||||
|
||||
|
@ -553,6 +554,11 @@ class Local extends \OC\Files\Storage\Common {
|
|||
}
|
||||
|
||||
public function writeStream(string $path, $stream, int $size = null): int {
|
||||
return (int)file_put_contents($this->getSourcePath($path), $stream);
|
||||
$result = file_put_contents($this->getSourcePath($path), $stream);
|
||||
if ($result === false) {
|
||||
throw new GenericFileException("Failed write steam to $path");
|
||||
} else {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@ use OC\Files\Filesystem;
|
|||
use OC\Files\Mount\MountPoint;
|
||||
use OC\Files\Storage\Common;
|
||||
use OC\Files\Storage\Temporary;
|
||||
use OC\Files\Stream\Quota;
|
||||
use OC\Files\View;
|
||||
use OCP\Constants;
|
||||
use OCP\Files\Config\IMountProvider;
|
||||
|
|
Loading…
Reference in New Issue