如何在Laravel项目中从公共图像的URL中删除/ storage?

时间:2019-02-02 17:10:40

标签: php filesystems laravel-5.7 laravel-storage

我想要实现的是从URL中删除/ storage,以便最终将其为www.example.com/images/x.jpg,而不是默认的www.example.com/storage/x.jpg

我尝试像这样从url的{​​{1}}删除/ storage:

config/filesystems.php

,但是它不起作用。我认为问题在于,没有前缀的文件将被视为公用文件夹中的文件。

是否有可能实现我想要达到的目标?

1 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法是添加新的images磁盘。这样,可以有选择地应用新的网址格式,并且不会干扰您现有的任何代码。

步骤1

将磁盘添加到 config / filesystems.php

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

这是您save file uploads到新磁盘的方式:

$request->file('image')->storeAs(/* path */ '/', /* filename */ 'x.jpg', /* disk */ 'images')

这是您创建类似于http://example.com/images/x.jpg的图像的链接的方法:

Storage::disk('images')->url('x.jpg')

步骤2

现在您可以创建指向这些图像的链接,因此必须确保服务器可以找到它们。您有多种选择。

选项1

在公共目录中创建符号链接,这是Laravel的默认public磁盘(/storage)的工作方式。

$ ln -s /var/www/example.com/storage/app/public/images /var/www/example.com/public/images

选项2

在Laravel应用程序中创建一条路线以提供图像。

Route::get('images/{file}', function ($file) {
    return Storage::disk('images')->response($file);
    // return Storage::disk('images')->download($file);
});

选项3

在您的网络服务器中创建重写规则。

在nginx中,它可能看起来像这样:

location /images/ {
    root /var/www/example.com/storage/app/public/;
}

在Apache中,您可以使用alias

Alias "/images" "/var/www/example.com/storage/app/public/images"