namespace BookStack\Uploads;
use BookStack\Exceptions\FileUploadException;
+use BookStack\Util\FilePathNormalizer;
use Exception;
use Illuminate\Contracts\Filesystem\Filesystem as Storage;
use Illuminate\Filesystem\FilesystemManager;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
-use League\Flysystem\WhitespacePathNormalizer;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class FileStorage
return $filePath;
}
+ /**
+ * Check whether the configured storage is remote from the host of this app.
+ */
+ public function isRemote(): bool
+ {
+ return $this->getStorageDiskName() === 's3';
+ }
+
+ /**
+ * Get the actual path on system for the given relative file path.
+ */
+ public function getSystemPath(string $filePath): string
+ {
+ if ($this->isRemote()) {
+ return '';
+ }
+
+ return storage_path('uploads/files/' . ltrim($this->adjustPathForStorageDisk($filePath), '/'));
+ }
+
/**
* Get the storage that will be used for storing files.
*/
*/
protected function getStorageDiskName(): string
{
- $storageType = config('filesystems.attachments');
+ $storageType = trim(strtolower(config('filesystems.attachments')));
// Change to our secure-attachment disk if any of the local options
// are used to prevent escaping that location.
*/
protected function adjustPathForStorageDisk(string $path): string
{
- $path = (new WhitespacePathNormalizer())->normalizePath(str_replace('uploads/files/', '', $path));
+ $trimmed = str_replace('uploads/files/', '', $path);
+ $normalized = FilePathNormalizer::normalize($trimmed);
if ($this->getStorageDiskName() === 'local_secure_attachments') {
- return $path;
+ return $normalized;
}
- return 'uploads/files/' . $path;
+ return 'uploads/files/' . $normalized;
}
}