Laravel 5에서 Storage Facade를 사용하여 파일 URL을 얻는 방법은 무엇입니까?


82

저는 Laravel 5와의 새로운 Flysystem 통합을 사용하여 실험 해 왔습니다. 저는 '지역화 된'경로를 DB에 저장하고 경로를 완성하기 위해 Storage 파사드를 가져오고 있습니다. 예를 들어 저장 screenshots/1.jpg하고 사용합니다.

Storage::disk('local')->get('screenshots/1.jpg')

또는

Storage::disk('s3')->get('screenshots/1.jpg') 

다른 디스크에서 동일한 파일을 검색 할 수 있습니다.

get 파일 내용을 검색하지만 다음과 같이 내 뷰에서 사용하고 싶습니다.

<img src="{{ Storage::path('screenshots/1.jpg') }}" />

그러나 경로 또는 전체 경로를 검색 할 수있는 것은 사용할 수 없습니다 (내가 볼 수있는 한). 그렇다면 전체 경로를 어떻게 반환 할 수 있습니까? 아니면 이것이 의도적 인 것인지 궁금합니다. 그렇다면 왜 전체 경로를 얻을 수 없어야합니까? 아니면 완전히 잘못된 방향으로 가고 있습니까?


1
경로가 아닌 URL을 요구하고 있습니다.
Adam

답변:


54

편집 : L5.2 + 솔루션

더 좋고 더 직접적인 솔루션이 있습니다.

Storage::url($filename)주어진 파일의 전체 경로 / URL을 가져 오는 데 사용 합니다. S3에서 스토리지 파일 시스템 으로 설정해야합니다 config/filesystems.php.'default' => 's3'

물론 Storage::disk('s3')->url($filename)같은 방법으로 할 수도 있습니다 .

보시다시피 Cloud 파일 시스템을 참조 config/filesystems.php하는 매개 변수도 'cloud' => 's3'정의되어 있습니다. 로컬 서버에서 스토리지 폴더를 관리하지만 클라우드 사용에서 일부 파일을 검색 / 저장하려는 경우 Storage::cloud()에도 동일한 파일 시스템 메서드, 즉 Storage::cloud()->url($filename).

Laravel 문서에는이 방법이 언급되어 있지 않지만 더 자세히 알고 싶다면 여기에서 소스 코드를 확인할 수 있습니다 .


좋은! 이것은 새로운 방법 이지만 지금 여기에있어 기쁩니다! 스토리지 클래스는 기본적으로 뷰에서 작동합니까? 그렇다면 정답으로 표시합니다.
daviestar 2016-04-05

예! 기본적으로 뷰에서 작동하므로 전혀 걱정할 필요가 없습니다.
Pere Joan Martorell

5
이것은 L5.2 + 용입니다
daviestar

153

스토리지 디스크의 경로는 다음과 같습니다.

$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()

나는 그것에 대한 더 짧은 해결책을 모릅니다 ...

$ storagePath를 뷰에 공유 한 다음

$storagePath."/myImg.jpg";

이것은 공용 저장소 폴더의 경로를 가져 오는 완벽한 솔루션입니다. 감사!
David

14
다른 방법은 다음 applyPathPrefix과 같이 사용하는 것입니다.Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix('myImg.jpg');
Maxim Lanin

3
@maximLanin : 어떻게 든 예제를 복사하면 마지막 (applyPathPrefix)에는 h와 P (path * Prefix) 사이에 이상한 문자가 있습니다. 그것을 복사하여 붙여 넣으면 오류가 발생합니다. 먼저 applyPathPrefix복사 할 수 있습니다. 아주 이상한. (예제에서 마지막 메소드 이름을 두 번 클릭하여 테스트 할 수 있습니다.
Maurice

3
getDriver()필요하지 않습니다. 단순히 Storage::disk('local')->getAdapter()->getPathPrefix()잘 작동합니다.
RA.

6
Laravel 5.4 새로운, 간단한 방법이 있기 때문에 것을 알고 아마도 좋은 Storage::path참조 빌랄의 대답
마틴 Koetsier

69

이 메서드는 Laravel 5.4부터 존재하며 다음과 같이 얻을 수 있습니다.

$path = Storage::disk('public')->path($filename);

1
Laravel 5.6에서 매력처럼 작동합니다. 다음 API에서이 일에 대해 누군가 불가사의는 여기 경우 laravel.com/api/5.6/Illuminate/Filesystem/...
천사 산티아고 제이미 발라

1
내가 볼 수있는 한,이 방법은 Laravel 5.4부터 존재합니다 ( laravel.com/api/5.4/Illuminate/Filesystem/… )
Marten Koetsier

위의 두 주석에있는 두 링크는 ​​모두 죽었습니다.
dotNET

9

이것이 내가 작동하게 한 방법입니다-환경 변수를 사용하여 s3와 로컬 디렉토리 경로를 전환하고 모든 뷰에 경로를 전달합니다.

.env에서 :

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

config / filesystems.php에서 :

'default' => env('APP_FILESYSTEM'),

에서 app/Providers/AppServiceProvider:

public function boot()
{
    view()->share('dynamic_storage', $this->storagePath());
}

protected function storagePath()
{
    if (Storage::getDefaultDriver() == 's3') {
        return Storage::getDriver()
                ->getAdapter()
                ->getClient()
                ->getObjectUrl(env('S3_BUCKET'), '');
    }

    return URL::to('/');
}

1
설명으로 s3 스토리지를 사용하면 오류가 발생했습니다. 그래서 저는 이것에 대한 예를 수정했습니다 return Storage::disk('s3')->getDriver()->getAdapter()->getClient()->getObjectUrl(env('S3_BUCKET'), '').'/';
Lionel Morrison

5

먼저 파일 URL / 링크를 얻은 다음 경로를 아래와 같이 가져옵니다.

$url = Storage::disk('public')->url($filename);
$path = public_path($url);

5

스토리지 (디스크) 경로를 표시하려면 다음을 사용하십시오.

Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage

또한 관심 이 있으시면 Laravel 전용 패키지 ( https://github.com/fsasvari/laravel-uploadify )를 만들었으므로 Eloquent 모델 필드에서 모든 필드를 사용할 수 있습니다.

$car = Car::first();

$car->upload_cover_image->url();
$car->upload_cover_image->name();
$car->upload_cover_image->basename();
$car->upload_cover_image->extension();
$car->upload_cover_image->filesize();

4

음, 몇 주 전에 저는 매우 유사한 질문을했습니다 ( 저장소를 통해 업로드 된 파일에서 CDN URL 가져 오기 ) : CDN URL이 내보기에 이미지를 표시하기를 원했습니다 (필요한대로).

그러나 패키지 API를 검토 한 후이 작업을 수행 할 방법이 없음을 확인했습니다. 그래서 내 해결책은 flysystem. 제 경우에는 RackSpace로 플레이해야했습니다. 그래서 마지막으로 내 사용 패키지를 만들고 OpenStack 용 PHP SDK를 사용하여 나만의 스토리지 패키지를 만들기로 결정했습니다 .

이렇게하면 getPublicUrl()cdn 컨테이너에서 공개 URL을 가져 오는 데 필요한 기능에 대한 전체 액세스 권한이 있습니다 .

/** @var DataObject $file */
$file = \OpenCloud::container('cdn')->getObject('screenshots/1.jpg');

// $url:  https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg
$url = (string) $file->getPublicUrl(UrlType::SSL);

결론적으로 스토리지 서비스를 다른 수준으로 끌어 올릴 필요가 있다면 flysystem충분하지 않습니다. 대한 local목적, 당신은 nXu의 솔루션 @ 시도 할 수 있습니다


3

파일의 절대 URL이 필요한 경우 아래 코드를 사용하십시오.

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg

2

저장 방법 :

public function upload($img){
   $filename = Carbon::now() . '-' .  $img->getClientOriginalName();
   return Storage::put($filename, File::get($img)) ? $filename : '';
}

노선:

 Route::get('image/{filename}', [
        'as'   => 'product.image',
        'uses' => 'ProductController@getImage',
    ]);

제어 장치:

 public function getImage($filename)
    {
        $file = Storage::get($filename);

        return new Response($file, 200);
    }

전망:

 <img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/>

왜 누군가가 그렇게할까요, 왜 s3를 사용하고 웹 서버에서 그것을 broxy!
Shady Keshk 2011

2

내가 찾은 또 다른 해결책은 다음과 같습니다.

Storage::disk('documents')->getDriver()->getConfig()->get('url')

문서 저장소의 기본 경로와 함께 URL을 반환합니다.


1

이것을보십시오 : laravel 4에서 이미지를보기 위해 storage_path ()를 사용하는 방법 . Laravel 5에도 동일하게 적용됩니다.

스토리지는 파일 시스템 용이며 대부분 웹 서버에서 액세스 할 수 없습니다. 권장되는 솔루션은 public/screenshots/예를 들어 공용 폴더 (문서 루트)에 이미지를 저장하는 것 입니다. 그런 다음 표시하려면을 사용하십시오 asset('screenshots/1.jpg').


나는 개발 때 '디스크'내 공용 폴더가 될 수를 설정하려고하고 S3하고 때 라이브
daviestar

Storage::path()서버에있는 파일의 경로를 반환하는 것은 중요하지 않지만 URL이 필요하며 웹 서버는 문서 루트의 파일 만 제공 할 수 있습니다 <project>/public. 그것을 사용 내부에 디렉토리를 생성 url()하거나 asset()블레이드 템플릿에서.
nXu

2
Storage::path()내가에 불구하고 그것을 좋아하는 것, 존재하지 않는
daviestar

좋아요, 오해 했어요, 죄송 해요 내가 할 일은 여전히 ​​똑같습니다. DB에 대한 전체 경로를 로컬이든 s3이든 저장하십시오. 이미지를 업로드 / 생성 할 때 사용할 이미지를 확인 getenv('debug')하고 결정하기 만하면 됩니다.
nXu

전체 경로를 저장하지 않으려 고했지만 아마도 가장 현명한 방법 일 것입니다.
daviestar

1

제 경우에는 src / Illuminate / Filesystem / FilesystemAdapter.php 파일에서 로컬 파일에 대해 별도의 메서드를 만들었습니다.

    /**
 * Get the local path for the given filename.
 * @param $path
 * @return string
 */
public function localPath($path)
{
    $adapter = $this->driver->getAdapter();
    if ($adapter instanceof LocalAdapter) {
        return $adapter->getPathPrefix().$path;
    } else {
        throw new RuntimeException('This driver does not support retrieving local path');
    }
}

다음, 난 프레임 워크에 끌어 오기 요청을 만들,하지만 여전히 아직 주요 핵심으로 병합되지 : https://github.com/laravel/framework/pull/13605는 누군가 병합이 하나)가 될 수 있음)


0

이 작업은 2020 년 laravel 7에서

        $image_resize = Image::make($image->getRealPath());
        $image_resize->resize(800,600);
        $image_resize->save(Storage::disk('episodes')->path('') . $imgname);

이렇게 사용할 수 있습니다

echo Storage::disk('public')->path('');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.