无法从存储laravel 5获取图像

问题描述 投票:6回答:4

嘿所以我试图把我的图像放到我的索引上的幻灯片中。图像保存在storage/app上,然后我从数据库中检索其余路径。

我设法在<img src>标签上输出正确的路径,标题得到的输出就像它应该的那样,但图像不会。

我从控制器发送和数组,然后在我的视图中循环它:

控制器:

public function index()
{
    $projects = Project::all()->take(4);
    return view('index' , compact('projects'));

}

索引视图

@foreach($projects as $project)
{{$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}}
<li><img src="{{$storagePath.$project->fetchMedia->first()->public_name}}"    title=" {{$project->name}}"></li>
        @endforeach

HTML输出是正确的路径:“/ home /vagrant/project/storage/app/projects/Domaa6.jpg”

但它没有显示图像。

我已经尝试使用HTML :: image帮助程序,但也没有成功。

有没有办法让它像它一样工作,还是我需要创建一个新的控制器来操纵我的图像?

fetchMedia是我的模型上的函数,它返回我的Media。

public function fetchMedia()
{
    return $this->hasMany('App\Media');
}
php image laravel
4个回答
11
投票

您尝试在存储目录中执行的操作是不可能的,但只能在公共目录中执行,同时将路径或URL暴露给您的laravel存储目录会产生一些漏洞及其不良做法

但是有一种方法可以解决它:

首先,当引用某个路径时,你需要一个Image包来动态生成图像,我推荐使用intervention/image,它有许多方法可以使图像管理变得轻而易举。

要实现此目的,请执行以下步骤:

1.安装干预图像:

将干预图像添加到您的composer.json和do qazxsw poi

composer update

在$ providers数组中,添加此包的服务提供者。

"require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "intervention/image": "2.*",
        "intervention/imagecache": "2.*"

        .....

将此包的外观添加到$ aliases数组中。

'Intervention\Image\ImageServiceProvider'

在Laravel 5中配置干预图像

'Image' => 'Intervention\Image\Facades\Image

在Laravel 4中发布配置

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

有关更多安装细节$ php artisan config:publish intervention/image

安装干预/图像后,您可以执行以下操作:

https://github.com/Intervention/image

2.设置将处理图像请求的路由

Image::make($path=storage_path('stock-photos/image1.jpg'));

3.然后在视图中您可以执行以下操作:

Route::get('stock-photos/{image}', function($image){

    //do so other checks here if you wish

    if(!File::exists( $image=storage_path("stock-photos/{$image}") )) abort(404);

    return Image::make($image)->response('jpg'); //will ensure a jpg is always returned
});

2
投票

不幸的是我无法对Digitlimit的帖子发表评论(因为我的声誉还不够高),但他们的回复对我有用,但有一点改变。而不是返回@foreach($projects as $project) <li> <img src="{{url('stock-photos/'. $project->fetchMedia->first()->public_name)}}" title="{{$project->name}}"> </li> @endforeach 我使用Image::make($image)方法,因为这似乎为我生成标题内容。所以举个例子

response()

希望能帮助其他人解决类似的问题。


0
投票

显示图像时,您不需要引用文件路径。进入Route::get('stock-photos/{image}', function($image){ if(!File::exists( $image=storage_path("stock-photos/{$image}") )) abort(404); $returnImage = Image::make($image); return $returnImage->response(); }); 标签的是您要显示的图像的URL。所以,在你的情况下,这将是

img

但。这将无法正常工作,因为您使@foreach($projects as $project) {{$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()}} <li><img src="/{{$project->fetchMedia->first()->public_name}}" title=" {{$project->name}}"></li> @endforeach 请求的资源应该是可公开访问的。 (如css,js-scripts,images)。有了这个说法,你需要将图像存储在不同的位置,公共文件夹是完美的地方。如果您保存图像,例如在http中,那么在您的视图中,您将像这样引用它们

public/images/projects

0
投票

虽然我已经使用Laravel大约两年了,但我刚刚开始使用它来处理图像上传(使用版本5.3.16)。图像处理故障排除引导我进入Stack Overflow帖子...原来接受的答案几乎解决了我遇到的问题,并进行了一些小的修改如下:

<img src="/images/projects/{{$project->fetchMedia->first()->public_name}}" />

在这个特定的例子中,我想检索一本书的特定上传图像。对于给定的书,我创建了一个与书的I.D相匹配的目录,并将图像上传到那里。

要检索图像,我首先获取公共存储目录。这通常在config / app目录中的'filesystems.php'配置文件中定义。我的示例如下(此答案不需要省略额外内容):

Route::get('images/books/{book_id}/{image}', function($book_id, $image){

    $storagePath  = Storage::disk('public')->getDriver()->getAdapter()->getPathPrefix();
    $imageFilePath = $storagePath . "images/books/{$book_id}/{$image}";
    if(!File::exists($imageFilePath)) abort(404);

    return Image::make($imageFilePath)->response();
});

路线信息的其余部分遵循与第一个接受的答案相同的模式。渲染图像也遵循接受的答案。

© www.soinside.com 2019 - 2024. All rights reserved.