namespace BookStack\Uploads;
+use BookStack\Util\FilePathNormalizer;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Filesystem\FilesystemAdapter;
-use League\Flysystem\WhitespacePathNormalizer;
use Symfony\Component\HttpFoundation\StreamedResponse;
class ImageStorageDisk
*/
protected function adjustPathForDisk(string $path): string
{
- $path = (new WhitespacePathNormalizer())->normalizePath(str_replace('uploads/images/', '', $path));
+ $trimmed = str_replace('uploads/images/', '', $path);
+ $normalized = FilePathNormalizer::normalize($trimmed);
if ($this->usingSecureImages()) {
- return $path;
+ return $normalized;
}
- return 'uploads/images/' . $path;
+ return 'uploads/images/' . $normalized;
}
/**
/**
* Get the file at the given path.
*/
- public function get(string $path): bool
+ public function get(string $path): ?string
{
return $this->filesystem->get($this->adjustPathForDisk($path));
}
+ /**
+ * Get a stream to the file at the given path.
+ * @returns ?resource
+ */
+ public function stream(string $path): mixed
+ {
+ return $this->filesystem->readStream($this->adjustPathForDisk($path));
+ }
+
/**
* Save the given image data at the given path. Can choose to set
* the image as public which will update its visibility after saving.
*/
public function mimeType(string $path): string
{
+ $path = $this->adjustPathForDisk($path);
return $this->filesystem instanceof FilesystemAdapter ? $this->filesystem->mimeType($path) : '';
}
*/
public function response(string $path): StreamedResponse
{
- return $this->filesystem->response($path);
+ return $this->filesystem->response($this->adjustPathForDisk($path));
}
/**