我目前正在通过文件输入来存储图像,例如:
<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
(在文档中有说明)。
如果有人知道是什么原因造成的,我将很高兴听到它!
提前感谢大家!
答案 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();
您可以使用Media
和getUrl
来检索与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只能公开公共文件夹。