public function duplicateFile(Request $request)
{
$namespace = $request->request->get('namespace');
$filename = $request->request->get('filename');
$filesystem = $this->filesystem()->getFilesystem($namespace);
// If the filename doesn't have an extension $extensionPos will be equal to its length, so that $fileBase will
// contain the entire filename. This also accounts for dotfiles.
$extensionPos = strrpos($filename, '.') ?: strlen($filename);
$fileBase = substr($filename, 0, $extensionPos) . '_copy';
$fileExtension = substr($filename, $extensionPos);
$n = 0;
// Increase $n until filename_copy$n.ext doesn't exist
do {
$n++;
$destination = $fileBase . $n . $fileExtension;
} while ($filesystem->has($destination));
try {
$filesystem->copy($filename, $destination);
return $this->json($destination, Response::HTTP_OK);
} catch (IOException $e) {
$msg = Trans::__('Unable to duplicate file: %FILE%', ['%FILE%' => $filename]);
$this->logException($msg, $e);
return $this->json($msg, Response::HTTP_INTERNAL_SERVER_ERROR);
}
}