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

저는 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') }}" />

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



답변

편집 : 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 문서에는이 방법이 언급되어 있지 않지만 더 자세히 알고 싶다면 여기에서 소스 코드를 확인할 수 있습니다 .


답변

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

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

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

$ storagePath를 뷰에 공유 한 다음

$storagePath."/myImg.jpg";


답변

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

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


답변

이것이 내가 작동하게 한 방법입니다-환경 변수를 사용하여 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('/');
}


답변

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

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


답변

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

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();


답변

음, 몇 주 전에 저는 매우 유사한 질문을했습니다 ( 저장소를 통해 업로드 된 파일에서 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의 솔루션 @ 시도 할 수 있습니다