简体   繁体   English

Laravel 5.2 如何显示存储图像

[英]How to display an storage image Laravel 5.2

I want tho disply an image on my view, but i receive: File not found .我想在我的视图中显示图像,但我收到: File not found

The two errors:两个错误:

FileNotFoundException in FilesystemAdapter.php line 61: storage/app/public/covers/teste-bravo_cover.jpg FileSystemAdapter.php 第 61 行中的 FileNotFoundException:storage/app/public/covers/teste-bravo_cover.jpg

FileNotFoundException in Filesystem.php line 386: File not found at path: storage/app/public/covers/teste-bravo_cover.jpg FileSystem.php 第 386 行中的 FileNotFoundException:在路径中找不到文件:storage/app/public/covers/teste-bravo_cover.jpg

But the image is in the correct folder:但图像在正确的文件夹中:

一只忙碌的猫文件夹上的文件

Well, in Laravel 5.2 storage:link won't work.好吧,在 Laravel 5.2 中storage:link将不起作用。

Image store on disk -works fine to store the image磁盘上的图像存储 - 可以很好地存储图像

if($cover){
            dump("ok1");
            Storage::disk('public_covers')->put($covername, File::get($cover));

            $coverObject = New Cover();      

            //path com o nome do arquivo
            $coverObject->imagePath = 'storage/app/public/covers/'.$covername;
            dump($coverObject->imagePath);
        }

        //Salva a capa com o path para o arquivo
        $coverObject->save();

My filesystems (with the "public_covers" disk) -works fine to store the image我的文件系统(带有“public_covers”磁盘) - 可以很好地存储图像

        'public_covers' => [
            'driver' => 'local',
            'root' => storage_path('app/public/covers'),
            'visibility' => 'public',
        ],

View code: (if movie have cover, show them)查看代码:(如果电影有封面,请出示)

                @if($movie->cover)
                <img src="{{route('cover.image', [$movie->cover])}}" />
                @endif

Route code, directing to controller method路由代码,指向控制器方法

Route::get('/movieimage/{coverId}',
[
               'as' => 'cover.image',
               'uses' => 'MovieController@getimage'
           ]
);

Controller Method to take the image控制器获取图像的方法

    public function getimage($coverId){
        $movie = Cover::find($coverId);
        //dump($movie);
        $imagePath = $movie['imagePath'];

        dump($imagePath);

        $file = Storage::disk('public_covers')->get($imagePath);

        $response = Response::make($file, 200);
        return $response;     
    }

you can try你可以试试

Need to include this需要包括这个

use Illuminate\Support\Facades\Storage;

And set in controller or route并在控制器或路由中设置

Route::get('storage/{filename}', function ($filename)
{

    $files = Storage::files('logs');  // set repo name of storage folder

    $path = storage_path('public/' . $filename);

    if (!File::exists($path)) {
        abort(404);
    }

    $file = File::get($path);
    $type = File::mimeType($path);

    $response = Response::make($file, 200);
    $response->header("Content-Type", $type);

    return $response;
});

I am new to laravel.我是laravel的新手。 I had the same problem though am on laravel 5.8.虽然我在 laravel 5.8 上遇到了同样的问题。 I had created the symlink to display a pdf as a view but the FileNotFoundException persisted.我创建了符号链接以将 pdf 显示为视图,但FileNotFoundException仍然存在。 I ended up accessing the pdf using this url localhost:8000/storage/filename.ext .我最终使用这个 url localhost:8000/storage/filename.ext访问了pdf。

After running ln -s /path/to/laravel/storage/public /path/to/laravel/public/storage or php artisan storage:link a storage folder is added to your appname/public directory.运行ln -s /path/to/laravel/storage/public /path/to/laravel/public/storagephp artisan storage:link一个存储文件夹将添加到您的appname/public目录中。 I think that once the link is created we access the images in the storage through the public link created.我认为一旦创建了链接,我们就可以通过创建的公共链接访问存储中的图像。 Try accessing the images via the new /appname/public/storage/app/pathtoimage folder created in the public directory and not pointing directly to the /appname/storage folder尝试通过在public目录中创建的新/appname/public/storage/app/pathtoimage文件夹访问图像,而不是直接指向/appname/storage文件夹

<img src={{asset('/storage/pathtoimg')}} /> # using storage folder in public

Check this solution will work for you 检查此解决方案是否适合您

How I solved my problem:我如何解决我的问题:

First of all, save the files on "public" folder.首先,将文件保存在“public”文件夹中。

On my filesystems.php i change my disk.在我的 filesystems.php 上,我更改了磁盘。 Now my root are "public_path" and not "storage_path"现在我的根是“public_path”而不是“storage_path”

        'public_covers' => [
            'driver' => 'local',
            'root' => public_path('images/covers'),
            'visibility' => 'public',
        ],

My controller method我的控制器方法

    public function store(Request $request){

        $cover = $request->file('cover');
        $inputs = $this->request->all();

        $this->validate($this->request, [
            'title' => 'required|max:255',
            'description' => 'required',
            'gender' => 'required',
            'secondGender' => 'required',
            'year' => 'numeric|min:1900|max:2100',
            'lenght' => 'numeric|min:10'
        ]);

        //build movie model object
        $movie = New Movie();
        $movie->user_id = \Auth::user()->id;
        $movie->gender_id = $inputs['gender'];
        $movie->secondgender_id = $inputs['secondGender'];
        $movie->title = $inputs['title'];
        $movie->slug = str_slug($inputs['title']);
        $movie->description = $inputs['description'];
        $movie->lenght = $inputs['lenght'];
        $movie->year = $inputs['year'];

        //TODO Mudar a composição do nome da foto para impedir que no futuro se sobreponha uma capa com outro filme que venha a ter o mesmo nome
        //TODO: Change the name createan to avoid overwrite the cover with an movie with the same name
        $covername = str_slug($inputs['title']).'_cover' .'.jpg';

        //if have an cover file
        if($cover){
            //storage the file on my public_covers (look my filesystems.php)
            Storage::disk('public_covers')->put($covername, File::get($cover));
            $coverObject = New Cover();      

            //path com o nome do arquivo
            //path with the file name
            $coverObject->imagePath = 'images/covers/'.$covername;

            $coverObject->save();
            $movie->cover_id = $coverObject->id;
        }

        $movie->save();

        return redirect()
            ->route('user.dashboard')
            ->with([
                       'success' => 'Filme adicionado com sucesso!',
                   ]);
    }

My view image code我的视图图像代码

@if($movie->cover)
                <img class="cover" src="{{ asset($movie->cover->imagePath) }}" alt="{{ $movie->title }}"">
                @else
                <img class="cover" src="{{ asset('images/noimage.jpg') }}" alt="{{ $movie->title }}">
                @endif

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM