저는 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의 솔루션 @ 시도 할 수 있습니다