public 폴더 밖에 저장된 이미지 요청에 대한 응답

이유야 어떻든 간에, 페이지 구성에 필요한 이미지든, 사용자가 업로드한 이미지든 웹 서버가 접근할 수 없는 public 폴더 밖에 저장하는 경우가 있을 것 같습니다. 대략 난감하죠? 클라이언트 요청에 이미지를 어떻게 응답할 수 있을까요?

Step #1 intervention/image 패키지를 설치합니다.

$ cd /path/to/project/root && composer require "intervention/image: 2.3.*"
// config/app.php
$providers = [
    'Intervention\Image\ImageServiceProvider',
],

$aliases = [
    'Image' => 'Intervention\Image\Facades\Image'
],

Step #2 이미지 요청 엔드포인트 라우팅을 정의합니다.

// app/Http/routes.php
// 이미지는 프로젝트 루트에 있는 images 폴더에 저장되어 있다고 가정합니다.

Route::get('images/{filename}', [
    'as'   => 'images.get',
    'uses' => 'ImagesController@get'
]);

Step #3 Controller를 정의합니다.

// app/Http/Controllers/ImagesController.php

class ImagesController extends Controller
{
    public function get($filename) 
    {
        $path = base_path('images' . DIRECTORY_SEPARATOR . $filename);

        if (! $path) {
            abort(404);
        }

        $image = \Image::make($path);

        return $image->response();
    }
}

Step #4 테스트해 봅니다.

$ open http://domain/images/example.jpg

여기까지 입니다. 게시판에 바로 쓰고, 돌려 보지는 않은 거라 오류가 있을 수 있습니다. 적극 제보해 주세요.

comments powered by Disqus