Laravel 5.7-Storage Link错误路径

时间:2018-10-12 12:50:21

标签: php laravel

我目前正在通过文件输入来存储图像,例如:

<input type="file" name="images" class="form-control">

在存储功能中,我这样存储文件和url:

      $blog = new Blog;

      $path = Storage::putFile('image', $request->file('images'));

      $url = Storage::url($path);

      $blog->file = $url;
      $blog->save();

哪个工作正常。作为修补程序中的路径,我获取每个博客($ blog-> file)的文件字符串,如下响应:

"/storage/images/GmjAKA6FkId7vli2aw1oq2Z3MkAzZQRxGPoQeVud.jpeg"

要在视图部件上显示图像,我使用:

<img src="asset/{{ $blog->file}}" alt="" class="card-img-top">

打印出来的

<img src="asset/storage/images/GmjAKA6FkId7vli2aw1oq2Z3MkAzZQRxGPoQeVud.jpeg" alt="" class="card-img-top">

在控制台中。

内部存储/图像中,我还可以查看所有已上传的图像。 但是,在我的文本编辑器中,存储和图像之间有一个“ app”文件夹,如下所示:

"storage/app/images"

这是没有图像显示的原因。

由于我正在使用Storage.put,为什么Storage将路径保存为“ storage / images /”而不是“ storage / app / images”?

Filesystems.php:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Filesystem Disk
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default filesystem disk that should be used
    | by the framework. The "local" disk, as well as a variety of cloud
    | based disks are available to your application. Just store away!
    |
    */

    'default' => env('FILESYSTEM_DRIVER', 'local'),

    /*
    |--------------------------------------------------------------------------
    | Default Cloud Filesystem Disk
    |--------------------------------------------------------------------------
    |
    | Many applications store files both locally and in the cloud. For this
    | reason, you may specify a default "cloud" driver here. This driver
    | will be bound as the Cloud disk implementation in the container.
    |
    */

    'cloud' => env('FILESYSTEM_CLOUD', 's3'),

    /*
    |--------------------------------------------------------------------------
    | Filesystem Disks
    |--------------------------------------------------------------------------
    |
    | Here you may configure as many filesystem "disks" as you wish, and you
    | may even configure multiple disks of the same driver. Defaults have
    | been setup for each driver as an example of the required options.
    |
    | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace"
    |
    */

    'disks' => [

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

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],

    ],

];

我之前运行过php artisan link:storage(在文档中有说明)。

如果有人知道是什么原因造成的,我将很高兴听到它!

提前感谢大家!

4 个答案:

答案 0 :(得分:1)

如果有人正在寻找解决方案,这里有个很好的提示:使用laravel-medialibrary

Medialibrary是一个Laravel(5.6及更高版本)软件包,可以将各种文件与Eloquent模型相关联。它提供了一个简单,流畅的API来使用。

使用上面的示例,您可以简单地执行以下操作:

$blog = Blog::find(1);
$blog->addMedia($pathToFile)->toMediaCollection('images');

或者,如果您想直接处理自己的上传,例如出现问题的情况,则

$blog->addMediaFromRequest('image')->toMediaCollection('images');

要检索文件,可以使用getMedia方法。该方法返回Media个对象的集合,换句话说,它返回给定Model的所有媒体:

$mediaItems = $blog->getMedia();

您可以使用MediagetUrl来检索与getPath对象关联的文件的URL和路径:

$publicUrl = $mediaItems[0]->getUrl();
$publicFullUrl = $mediaItems[0]->getFullUrl(); //url including domain
$fullPathOnDisk = $mediaItems[0]->getPath();

在简历中,通过使用此库,您无需直接担心任何存储配置,可以通过在模型本身上调用方法来完成所有操作。我强烈建议您看一下文档,它真的很容易使用。

答案 1 :(得分:0)

不是php artisan link:storage,而是php artisan storage:link

您必须使用asset()帮助程序来获取存储中图像的正确路径:

<img src="{{ asset($blog->file) }}" alt="" class="card-img-top">

答案 2 :(得分:0)

公开存储目录不是一个好习惯,

//另存为

Storage::disk('local')->put('/dir_name/'.unique_file_name.extension, File::get(tmp_dir_received));

它全局引用您的存储/应用目录

storage / app / dir_name检索文件内容。

<img src="{{ url('/dir_name/'.$blog->file) }}" alt="" class="card-img-top">

答案 3 :(得分:0)

感谢大家的回应!

我想出了以下“解决方案”:

我只是通过以下方式存储在公用文件夹中:

  $path = Storage::putFile('public', $request->file('images'));

似乎storage:link只能公开公共文件夹。