programing

larabel 5의 스토리지 파사드를 사용하여 파일 URL을 알려주세요.

sourcetip 2022. 9. 5. 23:29
반응형

larabel 5의 스토리지 파사드를 사용하여 파일 URL을 알려주세요.

Larabel 5 와 system system system system system lar system lar system lar lar lar lar lar lar lar lar lar lar 。DB에 대한 '로컬화된' 경로를 저장하고 스토리지 파사드가 경로를 완료하도록 하고 있습니다.를 들면, 「」, 「」를 합니다.screenshots/1.jpg and and를 합니다.

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

또는

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

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

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

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

패스 또는 풀 패스를 취득할 수 있는 것은 사용할 수 없습니다(내가 보기에는).그럼 어떻게 하면 전체 경로를 되돌릴 수 있을까요?아니면, 이게 의도적인 건지 궁금하네요.그렇다면 왜 풀패스를 이용할 수 없는 거죠?아니면 제가 완전히 잘못된 방향으로 가고 있는 건가요?

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

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

난 그것에 대한 더 짧은 해결책은 몰라...

$storagePath를 Views로 공유하여

$storagePath."/myImg.jpg";

이 방법은 Larabel 5.4 이후부터 존재하며 다음 방법으로 얻을 수 있습니다.

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

편집: L5.2+용 솔루션

더 좋고 간단한 해결책이 있습니다.

Storage::url($filename)지정된 파일의 전체 경로/URL을 가져옵니다., 이 경우 합니다.S3 config/filesystems.php'default' => 's3'

은 할 수 .Storage::disk('s3')->url($filename)같은 방법으로.

에서 알 수 있듯이config/filesystems.php'cloud' => 's3'이치노 내의을 가져오거나 를 사용합니다.Storage::cloud()Storage::cloud()->url($filename).

Laravel 문서에는 이 방법이 기재되어 있지 않습니다만, 자세한 것은 이쪽에서 소스코드를 확인해 주세요.

이렇게 해서 환경변수가 있는 s3 경로와 로컬 디렉토리 경로 사이를 전환하여 모든 뷰에 경로를 전달합니다.

.env의 경우:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

구성/파일 시스템에서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('/');
}

저장소(디스크) 경로만 표시하려면 다음을 사용합니다.

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

또한 관심 있으시면 Laravel 전용 패키지(https://github.com/fsasvari/laravel-uploadify)를 작성했습니다.이것에 의해, 웅변 모델 필드의 모든 필드를 사용할 수 있습니다.

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

파일의 절대 URL 이 필요한 경우는, 다음의 코드를 사용합니다.

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

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

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

몇 주 전에 매우 유사한 질문을 했습니다(스토리지에서 업로드된 파일에서 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의 솔루션을 사용해 볼 수 있습니다.

저장 방법:

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"/>

또 다른 솔루션은 다음과 같습니다.

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

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

이 일은 2020년 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('');

이것 좀 보세요.storage_path()를 사용하여 Larabel 4의 이미지를 표시하는 방법.이것도 Larabel 5에 적용됩니다.

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

제 경우 로컬파일에 대해 src/Iluminate/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 May be merge this merge this)

언급URL : https://stackoverflow.com/questions/28964412/how-to-get-file-url-using-storage-facade-in-laravel-5

반응형