无法从laravel 5的存储中获取图像

h9vpoimq  于 2023-08-08  发布在  其他
关注(0)|答案(6)|浏览(106)

嘿,所以我正试图把我的图像到幻灯片,我有我的索引。图像保存在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');
}

zzwlnbp8

zzwlnbp81#

你尝试做的是不可能在存储目录,但可能只在公共目录,也暴露路径或URL到您的laravel存储目录创建一些漏洞和它的坏习惯

但是有一种方法可以解决这个问题:

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

要实现此目标,请执行以下步骤:
1.安装干预镜像:

  • 将Intervention Image添加到您的composer.json和do composer update *
"require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "intervention/image": "2.*",
        "intervention/imagecache": "2.*"

        .....

字符串

  • 在$providers数组中添加此软件包的服务提供程序。*
'Intervention\Image\ImageServiceProvider'

  • 将此包的facade添加到$aliases数组中。*

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

  • 在Laravel 5中配置干预图像 *
$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

  • 在Laravel 4中发布配置 *
$ php artisan config:publish intervention/image


更多安装细节https://github.com/Intervention/image
安装intervention/image后,您可以执行以下操作:
Image::make($path=storage_path('stock-photos/image1.jpg'));

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

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

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

@foreach($projects as $project)
    <li>
        <img src="{{url('stock-photos/'. $project->fetchMedia->first()->public_name)}}" title="{{$project->name}}">
    </li>
@endforeach

ylamdve6

ylamdve62#

不幸的是,我不能对Digitlimit的帖子发表评论(因为我的声誉还不够高),但他们的回应对我有效,但有一个变化。我没有返回Image::make($image),而是使用了response()方法,因为这似乎为我生成了头内容。比如说

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

字符串
希望能帮助其他有类似问题的人。

f4t66c6m

f4t66c6m3#

当显示图像时,你不需要引用文件路径。进入img标记的是您要显示的图像的URL。所以,在你的情况下,这将是

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

字符串
但是.这也不起作用,因为你向http请求的资源应该是公共可访问的。(像css,js-scripts,images).话虽如此,您需要将图像存储在不同的位置,公共文件夹是最佳位置。例如,如果您将图像保存在public/images/projects中,则在视图中将像这样引用它们

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

6ss1mwsb

6ss1mwsb4#

虽然我已经使用Laravel大约2年了,但我最近才开始用它处理图像上传(使用版本5.3.16)。图像处理故障排除导致我到这个堆栈溢出后.最初接受的答案几乎解决了我遇到的问题,下面是一些小的变化:

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

字符串
在这个特定的例子中,我想检索一本书的特定上传图像。对于给定的书,我已经创建了一个目录,它与书的ID相匹配,并将图像上传到那里。
要检索图像,我首先获取公共存储目录。这通常在config/app目录下的'filesystems.php'配置文件中定义。下面是我的例子(省略了这个答案不需要的额外内容):

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Filesystem Disk
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default filesystem disk that should be used
    | by the framework. A "local" driver, as well as a variety of cloud
    | based drivers are available for your choosing. Just store away!
    |
    | Supported: "local", "ftp", "s3", "rackspace"
    |
    */

    'default' => 'local',

    .
    .
    .

    'disks' => [

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

    ],

];


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

pokxtpni

pokxtpni5#

storage_path()函数返回应用程序存储目录的完全限定路径。您还可以使用storage_path函数生成存储目录中给定文件的完全限定路径:

$path = storage_path();

 $path = storage_path('app/file.txt');

字符串
https://laravel.com/docs/8.x/helpers#method-storage-path

yqyhoc1h

yqyhoc1h6#

1.从laravel根目录中删除public/storage中的storage文件夹
1.然后运行php artisan storage:link
1.在您的视图中,现在可以使用下面的代码image)}}">显示图像,您的链接应该是这样的:

相关问题