X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/07b889547d28e68e5fc8f923c166bd607da17ad7..refs/pull/2023/head:/app/Uploads/ImageService.php diff --git a/app/Uploads/ImageService.php b/app/Uploads/ImageService.php index 8eefbaf9d..756149fe7 100644 --- a/app/Uploads/ImageService.php +++ b/app/Uploads/ImageService.php @@ -7,6 +7,7 @@ use DB; use Exception; use Illuminate\Contracts\Cache\Repository as Cache; use Illuminate\Contracts\Filesystem\Factory as FileSystem; +use Illuminate\Support\Str; use Intervention\Image\Exception\NotSupportedException; use Intervention\Image\ImageManager; use phpDocumentor\Reflection\Types\Integer; @@ -45,9 +46,9 @@ class ImageService extends UploadService */ protected function getStorage($type = '') { - $storageType = config('filesystems.default'); + $storageType = config('filesystems.images'); - // Override default location if set to local public to ensure not visible. + // Ensure system images (App logo) are uploaded to a public space if ($type === 'system' && $storageType === 'local_secure') { $storageType = 'local'; } @@ -140,12 +141,12 @@ class ImageService extends UploadService $imagePath = '/uploads/images/' . $type . '/' . Date('Y-m') . '/'; while ($storage->exists($imagePath . $imageName)) { - $imageName = str_random(3) . $imageName; + $imageName = Str::random(3) . $imageName; } $fullPath = $imagePath . $imageName; if ($secureUploads) { - $fullPath = $imagePath . str_random(16) . '-' . $imageName; + $fullPath = $imagePath . Str::random(16) . '-' . $imageName; } try { @@ -220,7 +221,7 @@ class ImageService extends UploadService $storage->put($thumbFilePath, $thumbData); $storage->setVisibility($thumbFilePath, 'public'); - $this->cache->put('images-' . $image->id . '-' . $thumbFilePath, $thumbFilePath, 60 * 72); + $this->cache->put('images-' . $image->id . '-' . $thumbFilePath, $thumbFilePath, 60 * 60 * 72); return $this->getPublicUrl($thumbFilePath); } @@ -253,7 +254,16 @@ class ImageService extends UploadService } else { $thumb->fit($width, $height); } - return (string)$thumb->encode(); + + $thumbData = (string)$thumb->encode(); + + // Use original image data if we're keeping the ratio + // and the resizing does not save any space. + if ($keepRatio && strlen($thumbData) > strlen($imageData)) { + return $imageData; + } + + return $thumbData; } /** @@ -417,7 +427,7 @@ class ImageService extends UploadService $isLocal = strpos(trim($uri), 'http') !== 0; // Attempt to find local files even if url not absolute - $base = baseUrl('/'); + $base = url('/'); if (!$isLocal && strpos($uri, $base) === 0) { $isLocal = true; $uri = str_replace($base, '', $uri); @@ -442,7 +452,12 @@ class ImageService extends UploadService return null; } - return 'data:image/' . pathinfo($uri, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageData); + $extension = pathinfo($uri, PATHINFO_EXTENSION); + if ($extension === 'svg') { + $extension = 'svg+xml'; + } + + return 'data:image/' . $extension . ';base64,' . base64_encode($imageData); } /** @@ -458,7 +473,7 @@ class ImageService extends UploadService // Get the standard public s3 url if s3 is set as storage type // Uses the nice, short URL if bucket name has no periods in otherwise the longer // region-based url will be used to prevent http issues. - if ($storageUrl == false && config('filesystems.default') === 's3') { + if ($storageUrl == false && config('filesystems.images') === 's3') { $storageDetails = config('filesystems.disks.s3'); if (strpos($storageDetails['bucket'], '.') === false) { $storageUrl = 'https://' . $storageDetails['bucket'] . '.s3.amazonaws.com'; @@ -469,7 +484,7 @@ class ImageService extends UploadService $this->storageUrl = $storageUrl; } - $basePath = ($this->storageUrl == false) ? baseUrl('/') : $this->storageUrl; + $basePath = ($this->storageUrl == false) ? url('/') : $this->storageUrl; return rtrim($basePath, '/') . $filePath; } }