* * 201: File was converted and written to the destination or temporary file * * @throws OCSException The file was unable to be converted * @throws OCSNotFoundException The file to be converted was not found */ #[NoAdminRequired] #[UserRateLimit(limit: 25, period: 120)] #[ApiRoute(verb: 'POST', url: '/api/v1/convert')] public function convert(int $fileId, string $targetMimeType, ?string $destination = null): DataResponse { $userFolder = $this->rootFolder->getUserFolder($this->userId); $file = $userFolder->getFirstNodeById($fileId); // Also throw a 404 if the file is not readable to not leak information if (!($file instanceof File) || $file->isReadable() === false) { throw new OCSNotFoundException($this->l10n->t('The file cannot be found')); } if ($destination !== null) { $destination = PathHelper::normalizePath($destination); $parentDir = dirname($destination); if (!$userFolder->nodeExists($parentDir)) { throw new OCSNotFoundException($this->l10n->t('The destination path does not exist: %1$s', [$parentDir])); } if (!$userFolder->get($parentDir)->isCreatable()) { throw new OCSForbiddenException($this->l10n->t('You do not have permission to create a file at the specified location')); } $destination = $userFolder->getFullPath($destination); } try { $convertedFile = $this->fileConversionManager->convert($file, $targetMimeType, $destination); } catch (ForbiddenException $e) { throw new OCSForbiddenException($e->getMessage()); } catch (GenericFileException $e) { throw new OCSBadRequestException($e->getMessage()); } catch (\Exception $e) { logger('files')->error($e->getMessage(), ['exception' => $e]); throw new OCSException($this->l10n->t('The file could not be converted.')); } $convertedFileRelativePath = $userFolder->getRelativePath($convertedFile); if ($convertedFileRelativePath === null) { throw new OCSNotFoundException($this->l10n->t('Could not get relative path to converted file')); } $file = $userFolder->get($convertedFileRelativePath); $fileId = $file->getId(); return new DataResponse([ 'path' => $convertedFileRelativePath, 'fileId' => $fileId, ], Http::STATUS_CREATED); } }