/** * Get an FS copy or original of this file and return the path. * Returns false on failure. Callers must not alter the file. * Temporary files are cleared automatically. * * @return string|false */ public function getLocalRefPath() { $this->assertRepoDefined(); if (!isset($this->fsFile)) { $this->fsFile = $this->repo->getLocalReference($this->getPath()); if (!$this->fsFile) { $this->fsFile = false; // null => false; cache negative hits } } return $this->fsFile ? $this->fsFile->getPath() : false; }
/** * Move or copy a file to a specified location. Returns a FileRepoStatus * object with the archive name in the "value" member on success. * * The archive name should be passed through to recordUpload for database * registration. * * @param string|FSFile $src Local filesystem path or virtual URL to the source image * @param string $dstRel Target relative path * @param int $flags A bitwise combination of: * File::DELETE_SOURCE Delete the source file, i.e. move rather than copy * @param array $options Optional additional parameters * @return FileRepoStatus On success, the value member contains the * archive name, or an empty string if it was a new file. */ function publishTo($src, $dstRel, $flags = 0, array $options = []) { $srcPath = $src instanceof FSFile ? $src->getPath() : $src; $repo = $this->getRepo(); if ($repo->getReadOnlyReason() !== false) { return $this->readOnlyFatalStatus(); } $this->lock(); // begin $archiveName = wfTimestamp(TS_MW) . '!' . $this->getName(); $archiveRel = 'archive/' . $this->getHashPath() . $archiveName; if ($repo->hasSha1Storage()) { $sha1 = $repo->isVirtualUrl($srcPath) ? $repo->getFileSha1($srcPath) : FSFile::getSha1Base36FromPath($srcPath); $dst = $repo->getBackend()->getPathForSHA1($sha1); $status = $repo->quickImport($src, $dst); if ($flags & File::DELETE_SOURCE) { unlink($srcPath); } if ($this->exists()) { $status->value = $archiveName; } } else { $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0; $status = $repo->publish($srcPath, $dstRel, $archiveRel, $flags, $options); if ($status->value == 'new') { $status->value = ''; } else { $status->value = $archiveName; } } $this->unlock(); // done return $status; }