diff options
Diffstat (limited to 'app/Http')
| -rw-r--r-- | app/Http/RequestHandlers/AutoCompleteFolder.php | 26 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/CleanDataFolder.php | 21 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/EditMediaFileAction.php | 21 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ExportGedcomClient.php | 2 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ExportGedcomServer.php | 4 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ImportGedcomAction.php | 4 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ImportThumbnailsAction.php | 71 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ImportThumbnailsData.php | 47 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ManageMediaData.php | 22 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/MapDataImportAction.php | 18 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/MapDataImportPage.php | 22 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/SynchronizeTrees.php | 29 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/UploadMediaAction.php | 13 |
13 files changed, 211 insertions, 89 deletions
diff --git a/app/Http/RequestHandlers/AutoCompleteFolder.php b/app/Http/RequestHandlers/AutoCompleteFolder.php index 28226d3bed..7bba5dc494 100644 --- a/app/Http/RequestHandlers/AutoCompleteFolder.php +++ b/app/Http/RequestHandlers/AutoCompleteFolder.php @@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemException; use Psr\Http\Message\ServerRequestInterface; use function assert; @@ -32,6 +33,11 @@ use function assert; */ class AutoCompleteFolder extends AbstractAutocompleteHandler { + /** + * @param ServerRequestInterface $request + * + * @return Collection<string> + */ protected function search(ServerRequestInterface $request): Collection { $tree = $request->getAttribute('tree'); @@ -41,14 +47,18 @@ class AutoCompleteFolder extends AbstractAutocompleteHandler $media_filesystem = Registry::filesystem()->media($tree); - $contents = new Collection($media_filesystem->listContents('', Filesystem::LIST_DEEP)); + try { + $contents = new Collection($media_filesystem->listContents('', Filesystem::LIST_DEEP)); - return $contents - ->filter(static function (array $object) use ($query): bool { - return $object['type'] === 'dir' && str_contains($object['path'], $query); - }) - ->values() - ->pluck('path') - ->take(static::LIMIT); + return $contents + ->filter(static function (array $object) use ($query): bool { + return $object['type'] === 'dir' && str_contains($object['path'], $query); + }) + ->values() + ->pluck('path') + ->take(static::LIMIT); + } catch (FilesystemException $ex) { + return new Collection(); + } } } diff --git a/app/Http/RequestHandlers/CleanDataFolder.php b/app/Http/RequestHandlers/CleanDataFolder.php index b3e0c9bb1d..4a0ae7ca7c 100644 --- a/app/Http/RequestHandlers/CleanDataFolder.php +++ b/app/Http/RequestHandlers/CleanDataFolder.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemException; use League\Flysystem\StorageAttributes; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -82,14 +83,20 @@ class CleanDataFolder implements RequestHandlerInterface } // List the top-level contents of the data folder - $entries = $data_filesystem->listContents('', Filesystem::LIST_SHALLOW) - ->map(static function (StorageAttributes $attributes): string { - if ($attributes->isDir()) { - return $attributes->path() . '/'; - } + try { + $entries = $data_filesystem->listContents('', Filesystem::LIST_SHALLOW) + ->map(static function (StorageAttributes $attributes): string { + if ($attributes->isDir()) { + return $attributes->path() . '/'; + } + + return $attributes->path(); + }) + ->toArray(); + } catch (FilesystemException $ex) { + $entries = []; + } - return $attributes->path(); - }); return $this->viewResponse('admin/clean-data', [ 'title' => I18N::translate('Clean up data folder'), diff --git a/app/Http/RequestHandlers/EditMediaFileAction.php b/app/Http/RequestHandlers/EditMediaFileAction.php index ba643b62f8..d9daac825c 100644 --- a/app/Http/RequestHandlers/EditMediaFileAction.php +++ b/app/Http/RequestHandlers/EditMediaFileAction.php @@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\PendingChangesService; use Fisharebest\Webtrees\Tree; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToMoveFile; +use League\Flysystem\UnableToRetrieveMetadata; use League\Flysystem\Util; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -140,12 +141,20 @@ class EditMediaFileAction implements RequestHandlerInterface // Update the filesystem, if we can. if ($old !== $new && !$media_file->isExternal() && $filesystem->fileExists($old)) { try { - $filesystem->move($old, $new); - FlashMessages::addMessage(I18N::translate('The media file %1$s has been renamed to %2$s.', Html::filename($media_file->filename()), Html::filename($file)), 'info'); - } catch (FilesystemException | UnableToMoveFile $ex) { - // Don't overwrite existing file - FlashMessages::addMessage(I18N::translate('The media file %1$s could not be renamed to %2$s.', Html::filename($media_file->filename()), Html::filename($file)), 'info'); - $file = $old; + $file_exists = $filesystem->fileExists($old); + + if ($file_exists) { + try { + $filesystem->move($old, $new); + FlashMessages::addMessage(I18N::translate('The media file %1$s has been renamed to %2$s.', Html::filename($media_file->filename()), Html::filename($file)), 'info'); + } catch (FilesystemException | UnableToMoveFile $ex) { + // Don't overwrite existing file + FlashMessages::addMessage(I18N::translate('The media file %1$s could not be renamed to %2$s.', Html::filename($media_file->filename()), Html::filename($file)), 'info'); + $file = $old; + } + } + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + // File does not exist? } } diff --git a/app/Http/RequestHandlers/ExportGedcomClient.php b/app/Http/RequestHandlers/ExportGedcomClient.php index 595fcc9fa4..bdeae8562f 100644 --- a/app/Http/RequestHandlers/ExportGedcomClient.php +++ b/app/Http/RequestHandlers/ExportGedcomClient.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemException; use League\Flysystem\ZipArchive\FilesystemZipArchiveProvider; use League\Flysystem\ZipArchive\ZipArchiveAdapter; use Psr\Http\Message\ResponseFactoryInterface; @@ -72,6 +73,7 @@ class ExportGedcomClient implements RequestHandlerInterface * @param ServerRequestInterface $request * * @return ResponseInterface + * @throws FilesystemException */ public function handle(ServerRequestInterface $request): ResponseInterface { diff --git a/app/Http/RequestHandlers/ExportGedcomServer.php b/app/Http/RequestHandlers/ExportGedcomServer.php index e8ceac0cb4..8340f6b331 100644 --- a/app/Http/RequestHandlers/ExportGedcomServer.php +++ b/app/Http/RequestHandlers/ExportGedcomServer.php @@ -26,6 +26,8 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Tree; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToWriteFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -96,7 +98,7 @@ class ExportGedcomServer implements RequestHandlerInterface /* I18N: %s is a filename */ FlashMessages::addMessage(I18N::translate('The family tree has been exported to %s.', Html::filename($filename)), 'success'); - } catch (Throwable $ex) { + } catch (FilesystemException | UnableToWriteFile $ex) { FlashMessages::addMessage( I18N::translate('The file %s could not be created.', Html::filename($filename)) . '<hr><samp dir="ltr">' . $ex->getMessage() . '</samp>', 'danger' diff --git a/app/Http/RequestHandlers/ImportGedcomAction.php b/app/Http/RequestHandlers/ImportGedcomAction.php index 3b58e2a7ab..439865f5b3 100644 --- a/app/Http/RequestHandlers/ImportGedcomAction.php +++ b/app/Http/RequestHandlers/ImportGedcomAction.php @@ -25,6 +25,8 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\TreeService; use Fisharebest\Webtrees\Tree; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToReadFile; use Nyholm\Psr7\UploadedFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -56,6 +58,8 @@ class ImportGedcomAction implements RequestHandlerInterface * @param ServerRequestInterface $request * * @return ResponseInterface + * @throws FilesystemException + * @throws UnableToReadFile */ public function handle(ServerRequestInterface $request): ResponseInterface { diff --git a/app/Http/RequestHandlers/ImportThumbnailsAction.php b/app/Http/RequestHandlers/ImportThumbnailsAction.php index 5e54761390..a0095bc67b 100644 --- a/app/Http/RequestHandlers/ImportThumbnailsAction.php +++ b/app/Http/RequestHandlers/ImportThumbnailsAction.php @@ -23,6 +23,11 @@ use Fisharebest\Webtrees\Mime; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\PendingChangesService; use Fisharebest\Webtrees\Services\TreeService; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToDeleteFile; +use League\Flysystem\UnableToMoveFile; +use League\Flysystem\UnableToReadFile; +use League\Flysystem\UnableToRetrieveMetadata; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -76,7 +81,13 @@ class ImportThumbnailsAction implements RequestHandlerInterface $xrefs = $params['xref']; $geds = $params['ged']; - if (!$data_filesystem->fileExists($thumbnail)) { + try { + $file_exists = $data_filesystem->fileExists($thumbnail); + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $file_exists = false; + } + + if (!$file_exists) { return response([]); } @@ -89,37 +100,51 @@ class ImportThumbnailsAction implements RequestHandlerInterface switch ($action) { case 'delete': - $data_filesystem->delete($thumbnail); + try { + $data_filesystem->delete($thumbnail); + } catch (FilesystemException | UnableToDeleteFile $ex) { + // Cannot delete the file. Leave it there. + } break; case 'add': - $mime_type = $data_filesystem->mimeType($thumbnail) ?: Mime::DEFAULT_TYPE; - $directory = dirname($thumbnail, 2); - $sha1 = sha1($data_filesystem->read($thumbnail)); - $extension = explode('/', $mime_type)[1]; - $move_to = $directory . '/' . $sha1 . '.' . $extension; + try { + $mime_type = $data_filesystem->mimeType($thumbnail) ?: Mime::DEFAULT_TYPE; + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $mime_type = Mime::DEFAULT_TYPE; + } - $data_filesystem->move($thumbnail, $move_to); + try { + $directory = dirname($thumbnail, 2); + $sha1 = sha1($data_filesystem->read($thumbnail)); + $extension = explode('/', $mime_type)[1]; + $move_to = $directory . '/' . $sha1 . '.' . $extension; - foreach ($media_objects as $media_object) { - $prefix = $media_object->tree()->getPreference('MEDIA_DIRECTORY'); - $gedcom = '1 FILE ' . substr($move_to, strlen($prefix)) . "\n2 FORM " . $extension; + $data_filesystem->move($thumbnail, $move_to); - if ($media_object->firstImageFile() === null) { - // The media object doesn't have an image. Add this as a secondary file. - $media_object->createFact($gedcom, true); - } else { - // The media object already has an image. Show this custom one in preference. - $gedcom = '0 @' . $media_object->xref() . "@ OBJE\n" . $gedcom; - foreach ($media_object->facts() as $fact) { - $gedcom .= "\n" . $fact->gedcom(); + foreach ($media_objects as $media_object) { + $prefix = $media_object->tree()->getPreference('MEDIA_DIRECTORY'); + $gedcom = '1 FILE ' . substr($move_to, strlen($prefix)) . "\n2 FORM " . $extension; + + if ($media_object->firstImageFile() === null) { + // The media object doesn't have an image. Add this as a secondary file. + $media_object->createFact($gedcom, true); + } else { + // The media object already has an image. Show this custom one in preference. + $gedcom = '0 @' . $media_object->xref() . "@ OBJE\n" . $gedcom; + foreach ($media_object->facts() as $fact) { + $gedcom .= "\n" . $fact->gedcom(); + } + $media_object->updateRecord($gedcom, true); } - $media_object->updateRecord($gedcom, true); - } - // Accept the changes, to keep the filesystem in sync with the GEDCOM data. - $this->pending_changes_service->acceptRecord($media_object); + // Accept the changes, to keep the filesystem in sync with the GEDCOM data. + $this->pending_changes_service->acceptRecord($media_object); + } + } catch (FilesystemException | UnableToReadFile | UnableToMoveFile $ex) { + // Cannot import the file? } + break; } diff --git a/app/Http/RequestHandlers/ImportThumbnailsData.php b/app/Http/RequestHandlers/ImportThumbnailsData.php index 40ac0087ad..b0ded5aa52 100644 --- a/app/Http/RequestHandlers/ImportThumbnailsData.php +++ b/app/Http/RequestHandlers/ImportThumbnailsData.php @@ -27,8 +27,10 @@ use Fisharebest\Webtrees\Services\SearchService; use Illuminate\Support\Collection; use Intervention\Image\ImageManager; use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemOperator; use League\Flysystem\StorageAttributes; +use League\Flysystem\UnableToRetrieveMetadata; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -89,13 +91,17 @@ class ImportThumbnailsData implements RequestHandlerInterface $search = $request->getQueryParams()['search']['value']; // Fetch all thumbnails - $thumbnails = Collection::make($data_filesystem->listContents('', Filesystem::LIST_DEEP)) - ->filter(static function (StorageAttributes $attributes): bool { - return $attributes->isFile() && str_contains($attributes->path(), '/thumbs/'); - }) - ->map(static function (StorageAttributes $attributes): string { - return $attributes->path(); - }); + try { + $thumbnails = Collection::make($data_filesystem->listContents('', Filesystem::LIST_DEEP)) + ->filter(static function (StorageAttributes $attributes): bool { + return $attributes->isFile() && str_contains($attributes->path(), '/thumbs/'); + }) + ->map(static function (StorageAttributes $attributes): string { + return $attributes->path(); + }); + } catch (FilesystemException $ex) { + $thumbnails = new Collection(); + } $recordsTotal = $thumbnails->count(); @@ -187,21 +193,30 @@ class ImportThumbnailsData implements RequestHandlerInterface { // The original filename was generated from the thumbnail filename. // It may not actually exist. - if (!$data_filesystem->fileExists($original)) { + try { + $file_exists = $data_filesystem->fileExists($original); + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $file_exists = false; + } + + if (!$file_exists) { return 100; } - $thumbnail_type = explode('/', $data_filesystem->mimeType($thumbnail) ?: Mime::DEFAULT_TYPE)[0]; - $original_type = explode('/', $data_filesystem->mimeType($original) ?: Mime::DEFAULT_TYPE)[0]; + try { + $thumbnail_type = $data_filesystem->mimeType($thumbnail) ?: Mime::DEFAULT_TYPE; + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $thumbnail_type = Mime::DEFAULT_TYPE; + } - if ($thumbnail_type !== 'image') { - // If the thumbnail file is not an image then similarity is unimportant. - // Response with an exact match, so the GUI will recommend deleting it. - return 100; + try { + $original_type = $data_filesystem->mimeType($original) ?: Mime::DEFAULT_TYPE; + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $original_type = Mime::DEFAULT_TYPE; } - if ($original_type !== 'image') { - // If the original file is not an image then similarity is unimportant . + if (explode('/', $thumbnail_type)[0] !== 'image' || explode('/', $original_type)[0] !== 'image') { + // If either file is not an image then similarity is unimportant . // Response with an exact mismatch, so the GUI will recommend importing it. return 0; } diff --git a/app/Http/RequestHandlers/ManageMediaData.php b/app/Http/RequestHandlers/ManageMediaData.php index 2f25eefc37..b5d86041e9 100644 --- a/app/Http/RequestHandlers/ManageMediaData.php +++ b/app/Http/RequestHandlers/ManageMediaData.php @@ -31,7 +31,9 @@ use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; +use League\Flysystem\FilesystemException; use League\Flysystem\FilesystemOperator; +use League\Flysystem\UnableToCheckFileExistence; use League\Flysystem\UnableToReadFile; use League\Flysystem\UnableToRetrieveMetadata; use Psr\Http\Message\ResponseInterface; @@ -211,8 +213,8 @@ class ManageMediaData implements RequestHandlerInterface $callback = function (array $row) use ($data_filesystem, $media_trees): array { try { - $mime_type = $data_filesystem->mimeType($row[0]); - } catch (UnableToRetrieveMetadata $ex) { + $mime_type = $data_filesystem->mimeType($row[0]) ?: Mime::DEFAULT_TYPE; + } catch (FileSystemException | UnableToRetrieveMetadata $ex) { $mime_type = Mime::DEFAULT_TYPE; } @@ -314,8 +316,18 @@ class ManageMediaData implements RequestHandlerInterface $html .= '<dt>' . I18N::translate('Filename') . '</dt>'; $html .= '<dd>' . e($file) . '</dd>'; - if ($data_filesystem->fileExists($file)) { - $size = $data_filesystem->fileSize($file); + try { + $file_exists = $data_filesystem->fileExists($file); + } catch (FilesystemException | UnableToCheckFileExistence $ex) { + $file_exists = false; + } + + if ($file_exists) { + try { + $size = $data_filesystem->fileSize($file); + } catch (FilesystemException | UnableToRetrieveMetadata $ex) { + $size = 0; + } $size = intdiv($size + 1023, 1024); // Round up to next KB /* I18N: size of file in KB */ $size = I18N::translate('%s KB', I18N::number($size)); @@ -329,7 +341,7 @@ class ManageMediaData implements RequestHandlerInterface $html .= '<dt>' . I18N::translate('Image dimensions') . '</dt>'; /* I18N: image dimensions, width × height */ $html .= '<dd>' . I18N::translate('%1$s × %2$s pixels', I18N::number($imgsize['0']), I18N::number($imgsize['1'])) . '</dd>'; - } catch (Throwable $ex) { + } catch (FilesystemException | UnableToReadFile | Throwable $ex) { // Not an image, or not a valid image? } } diff --git a/app/Http/RequestHandlers/MapDataImportAction.php b/app/Http/RequestHandlers/MapDataImportAction.php index 701d05bb9e..54598826ff 100644 --- a/app/Http/RequestHandlers/MapDataImportAction.php +++ b/app/Http/RequestHandlers/MapDataImportAction.php @@ -27,6 +27,9 @@ use Fisharebest\Webtrees\PlaceLocation; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MapDataService; use Illuminate\Database\Capsule\Manager as DB; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToCheckFileExistence; +use League\Flysystem\UnableToReadFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\UploadedFileInterface; @@ -82,9 +85,20 @@ class MapDataImportAction implements RequestHandlerInterface $fp = false; - if ($serverfile !== '' && $data_filesystem->fileExists(MapDataService::PLACES_FOLDER . $serverfile)) { + try { + $file_exists = $data_filesystem->fileExists(MapDataService::PLACES_FOLDER . $serverfile); + } catch (FilesystemException | UnableToCheckFileExistence $ex) { + $file_exists = false; + } + + + if ($serverfile !== '' && $file_exists) { // first choice is file on server - $fp = $data_filesystem->readStream(MapDataService::PLACES_FOLDER . $serverfile); + try { + $fp = $data_filesystem->readStream(MapDataService::PLACES_FOLDER . $serverfile); + } catch (FilesystemException | UnableToReadFile $ex) { + $fp = false; + } } elseif ($local_file instanceof UploadedFileInterface && $local_file->getError() === UPLOAD_ERR_OK) { // 2nd choice is local file $fp = $local_file->getStream()->detach(); diff --git a/app/Http/RequestHandlers/MapDataImportPage.php b/app/Http/RequestHandlers/MapDataImportPage.php index 2c3b14ea79..d075c8f9da 100644 --- a/app/Http/RequestHandlers/MapDataImportPage.php +++ b/app/Http/RequestHandlers/MapDataImportPage.php @@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MapDataService; use Illuminate\Database\Eloquent\Collection; +use League\Flysystem\FilesystemException; use League\Flysystem\StorageAttributes; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -52,15 +53,20 @@ class MapDataImportPage implements RequestHandlerInterface $data_filesystem = Registry::filesystem()->data(); $data_filesystem_name = Registry::filesystem()->dataName(); - $files = $data_filesystem->listContents('places') - ->filter(static function (StorageAttributes $attributes): bool { - $extension = pathinfo($attributes->path(), PATHINFO_EXTENSION); + try { + $files = $data_filesystem->listContents('places') + ->filter(static function (StorageAttributes $attributes): bool { + $extension = pathinfo($attributes->path(), PATHINFO_EXTENSION); - return $extension === 'csv' || $extension === 'geojson'; - }) - ->map(static function (StorageAttributes $attributes): string { - return pathinfo($attributes->path(), PATHINFO_BASENAME); - }); + return $extension === 'csv' || $extension === 'geojson'; + }) + ->map(static function (StorageAttributes $attributes): string { + return pathinfo($attributes->path(), PATHINFO_BASENAME); + }) + ->toArray(); + } catch (FilesystemException $ex) { + $files = []; + } $files = Collection::make($files)->sort(); diff --git a/app/Http/RequestHandlers/SynchronizeTrees.php b/app/Http/RequestHandlers/SynchronizeTrees.php index e43180fbff..55d97426c9 100644 --- a/app/Http/RequestHandlers/SynchronizeTrees.php +++ b/app/Http/RequestHandlers/SynchronizeTrees.php @@ -26,6 +26,9 @@ use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\AdminService; use Fisharebest\Webtrees\Services\TimeoutService; use Fisharebest\Webtrees\Services\TreeService; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToReadFile; +use League\Flysystem\UnableToRetrieveMetadata; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamFactoryInterface; @@ -79,22 +82,26 @@ class SynchronizeTrees implements RequestHandlerInterface foreach ($gedcom_files as $gedcom_file) { // Only import files that have changed - $filemtime = (string) $data_filesystem->lastModified($gedcom_file); + try { + $filemtime = (string) $data_filesystem->lastModified($gedcom_file); - $tree = $this->tree_service->all()->get($gedcom_file) ?? $this->tree_service->create($gedcom_file, $gedcom_file); + $tree = $this->tree_service->all()->get($gedcom_file) ?? $this->tree_service->create($gedcom_file, $gedcom_file); - if ($tree->getPreference('filemtime') !== $filemtime) { - $resource = $data_filesystem->readStream($gedcom_file); - $stream = app(StreamFactoryInterface::class)->createStreamFromResource($resource); - $this->tree_service->importGedcomFile($tree, $stream, $gedcom_file); - $stream->close(); - $tree->setPreference('filemtime', $filemtime); + if ($tree->getPreference('filemtime') !== $filemtime) { + $resource = $data_filesystem->readStream($gedcom_file); + $stream = app(StreamFactoryInterface::class)->createStreamFromResource($resource); + $this->tree_service->importGedcomFile($tree, $stream, $gedcom_file); + $stream->close(); + $tree->setPreference('filemtime', $filemtime); - FlashMessages::addMessage(I18N::translate('The GEDCOM file “%s” has been imported.', e($gedcom_file)), 'success'); + FlashMessages::addMessage(I18N::translate('The GEDCOM file “%s” has been imported.', e($gedcom_file)), 'success'); - if ($this->timeout_service->isTimeNearlyUp(10.0)) { - return redirect(route(__CLASS__), StatusCodeInterface::STATUS_TEMPORARY_REDIRECT); + if ($this->timeout_service->isTimeNearlyUp(10.0)) { + return redirect(route(__CLASS__), StatusCodeInterface::STATUS_TEMPORARY_REDIRECT); + } } + } catch (FilesystemException | UnableToRetrieveMetadata | UnableToReadFile $ex) { + // Can't read the file - skip it. } } diff --git a/app/Http/RequestHandlers/UploadMediaAction.php b/app/Http/RequestHandlers/UploadMediaAction.php index 62b9f32c07..3b4b7c31d4 100644 --- a/app/Http/RequestHandlers/UploadMediaAction.php +++ b/app/Http/RequestHandlers/UploadMediaAction.php @@ -26,6 +26,9 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\MediaFileService; +use League\Flysystem\FilesystemException; +use League\Flysystem\UnableToCheckFileExistence; +use League\Flysystem\UnableToWriteFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\UploadedFileInterface; @@ -116,7 +119,13 @@ class UploadMediaAction implements RequestHandlerInterface $path = $folder . $filename; - if ($data_filesystem->fileExists($path)) { + try { + $file_exists = $data_filesystem->fileExists($path); + } catch (FilesystemException | UnableToCheckFileExistence $ex) { + $file_exists = false; + } + + if ($file_exists) { FlashMessages::addMessage(I18N::translate('The file %s already exists. Use another filename.', $path, 'error')); continue; } @@ -126,7 +135,7 @@ class UploadMediaAction implements RequestHandlerInterface $data_filesystem->writeStream($path, $uploaded_file->getStream()->detach()); FlashMessages::addMessage(I18N::translate('The file %s has been uploaded.', Html::filename($path)), 'success'); Log::addMediaLog('Media file ' . $path . ' uploaded'); - } catch (Throwable $ex) { + } catch (FilesystemException | UnableToWriteFile $ex) { FlashMessages::addMessage(I18N::translate('There was an error uploading your file.') . '<br>' . e($ex->getMessage()), 'danger'); } } |
