X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/93223fcd3d08b3255566ca6a7626d3e6cf3a25e9..refs/pull/139/head:/app/Services/ImageService.php diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index 3f3094103..dd965c90f 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -1,7 +1,10 @@ getClientOriginalName(); $imageData = file_get_contents($uploadedFile->getRealPath()); - return $this->saveNew($imageName, $imageData, $type); + return $this->saveNew($imageName, $imageData, $type, $uploadedTo); } @@ -70,12 +75,14 @@ class ImageService * @param string $imageName * @param string $imageData * @param string $type + * @param int $uploadedTo * @return Image + * @throws ImageUploadException */ - private function saveNew($imageName, $imageData, $type) + private function saveNew($imageName, $imageData, $type, $uploadedTo = 0) { $storage = $this->getStorage(); - $secureUploads = Setting::get('app-secure-images'); + $secureUploads = setting('app-secure-images'); $imageName = str_replace(' ', '-', $imageName); if ($secureUploads) $imageName = str_random(16) . '-' . $imageName; @@ -86,17 +93,27 @@ class ImageService } $fullPath = $imagePath . $imageName; - $storage->put($fullPath, $imageData); + try { + $storage->put($fullPath, $imageData); + } catch (Exception $e) { + throw new ImageUploadException('Image Path ' . $fullPath . ' is not writable by the server.'); + } - $userId = auth()->user()->id; - $image = Image::forceCreate([ + $imageDetails = [ 'name' => $imageName, 'path' => $fullPath, 'url' => $this->getPublicUrl($fullPath), 'type' => $type, - 'created_by' => $userId, - 'updated_by' => $userId - ]); + 'uploaded_to' => $uploadedTo + ]; + + if (auth()->user() && auth()->user()->id !== 0) { + $userId = auth()->user()->id; + $imageDetails['created_by'] = $userId; + $imageDetails['updated_by'] = $userId; + } + + $image = Image::forceCreate($imageDetails); return $image; } @@ -107,10 +124,12 @@ class ImageService * Checks the cache then storage to avoid creating / accessing the filesystem on every check. * * @param Image $image - * @param int $width - * @param int $height - * @param bool $keepRatio + * @param int $width + * @param int $height + * @param bool $keepRatio * @return string + * @throws Exception + * @throws ImageUploadException */ public function getThumbnail(Image $image, $width = 220, $height = 220, $keepRatio = false) { @@ -127,8 +146,16 @@ class ImageService return $this->getPublicUrl($thumbFilePath); } - // Otherwise create the thumbnail - $thumb = $this->imageTool->make($storage->get($image->path)); + try { + $thumb = $this->imageTool->make($storage->get($image->path)); + } catch (Exception $e) { + if ($e instanceof \ErrorException || $e instanceof NotSupportedException) { + throw new ImageUploadException('The server cannot create thumbnails. Please check you have the GD PHP extension installed.'); + } else { + throw $e; + } + } + if ($keepRatio) { $thumb->resize($width, null, function ($constraint) { $constraint->aspectRatio(); @@ -188,6 +215,7 @@ class ImageService $imageName = str_replace(' ', '-', $user->name . '-gravatar.png'); $image = $this->saveNewFromUrl($url, 'user', $imageName); $image->created_by = $user->id; + $image->updated_by = $user->id; $image->save(); return $image; } @@ -200,7 +228,7 @@ class ImageService { if ($this->storageInstance !== null) return $this->storageInstance; - $storageType = env('STORAGE_TYPE'); + $storageType = config('filesystems.default'); $this->storageInstance = $this->fileSystem->disk($storageType); return $this->storageInstance; @@ -226,10 +254,10 @@ class ImageService private function getPublicUrl($filePath) { if ($this->storageUrl === null) { - $storageUrl = env('STORAGE_URL'); + $storageUrl = config('filesystems.url'); // Get the standard public s3 url if s3 is set as storage type - if ($storageUrl == false && env('STORAGE_TYPE') === 's3') { + if ($storageUrl == false && config('filesystems.default') === 's3') { $storageDetails = config('filesystems.disks.s3'); $storageUrl = 'https://s3-' . $storageDetails['region'] . '.amazonaws.com/' . $storageDetails['bucket']; }