summaryrefslogtreecommitdiff
path: root/app/Http
diff options
context:
space:
mode:
Diffstat (limited to 'app/Http')
-rw-r--r--app/Http/RequestHandlers/AutoCompleteFolder.php26
-rw-r--r--app/Http/RequestHandlers/CleanDataFolder.php21
-rw-r--r--app/Http/RequestHandlers/EditMediaFileAction.php21
-rw-r--r--app/Http/RequestHandlers/ExportGedcomClient.php2
-rw-r--r--app/Http/RequestHandlers/ExportGedcomServer.php4
-rw-r--r--app/Http/RequestHandlers/ImportGedcomAction.php4
-rw-r--r--app/Http/RequestHandlers/ImportThumbnailsAction.php71
-rw-r--r--app/Http/RequestHandlers/ImportThumbnailsData.php47
-rw-r--r--app/Http/RequestHandlers/ManageMediaData.php22
-rw-r--r--app/Http/RequestHandlers/MapDataImportAction.php18
-rw-r--r--app/Http/RequestHandlers/MapDataImportPage.php22
-rw-r--r--app/Http/RequestHandlers/SynchronizeTrees.php29
-rw-r--r--app/Http/RequestHandlers/UploadMediaAction.php13
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');
}
}