如何解决从数据库中检索图像并显示 Laravel
我正在 Laravel 框架中创建一个 Web 应用程序。我已经编写了在数据库中保存图像的代码。
public function store(Request $request)
{
$request->validate([
'title' => 'required','description' => 'required','category_id' => 'required',]);
$user = request()->user();
$assortment = $user->assortments()->create($request->all());
if($request->hasFile('image') && $request->file('image')->isValid()) {
if($request->hasFile('image') && $request->file('image')->isValid()) {
//dd($request->image->store('images','public'));
$assortment->image_path = $request->image->store('images','public');
$assortment->save();
//Check what the Storage::url() generates
//dd(Storage::disk('public')->url($assortment->fresh()->image_path));
}
else {
abort(500,"Image not valid");
}
}
if ($request->wantsJson()) {
return response([],204);
}
return redirect()->route('assortments.show',$assortment->slug)
->with('success','Verzameling is succesvol aangemaakt.');
}
我希望从视图中的数据库中检索我的图像,但我不知道如何执行此操作。我试过这样的事情:
<img src="/images/{{ $imageVariableName }}">
变量和路径改变了
我试图让我的图像被检索和显示的视图:
<div class="mt-10">
<ul class="md:grid md:grid-cols-2 md:gap-x-8 md:gap-y-10">
@foreach ($assortment->itemCategories as $category)
<li>
<a href="{{ route('categories.show',[$assortment->slug,$category->id]) }}">
<div class="flex px-4 py-5 bg-white shadow overflow-hidden sm:rounded-md sm:px-6">
<div class="flex-shrink-0">
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
<!-- Heroicon name: globe-alt -->
</div>
</div>
<div class="ml-4">
<h4 class="text-lg leading-6 font-medium text-gray-900">{{ $category->name }}</h4>
</div>
</div>
</a>
</li>
@endforeach
</ul>
</div>
有人知道我是怎么做的吗?
编辑
我也试过:
<img src="{{ Storage::disk('public')->url($assortment->image_path) }}">
但它也没有返回图像。刚回来:
http://localhost/storage/tmp/PHPSX2W3G
编辑
我现在知道问题与我的上传控制器有关。该文件不应存储在临时路径:/storage//tmp/PHPL1ZVcx
编辑 2
存储链接似乎已损坏。在我的 public/storage
中获取此信息:
帕尔萨
解决方法
你可以使用
<img src={{Storage::url($assortment->img)}} />
编辑: 我发现了你的问题,问题不在显示上,而是在你的上传代码中
if ($request->hasFile('image')) {
$image = $request->file('image'); //request the file
$fileName = md5($image->getClientOriginalName() . microtime()) . '.' . $image->getClientOriginalExtension(); //use md5 for security reasons and get the extension.
$image->storeAs('',$fileName,'public'); //store the file in the public folder disk.
$assortment->image_path = $fileName;
$assortment->save();
}
应该变成,因为$filename只是一个临时上传的文件,后面会被删除,实际上传路径由storeAs返回
if ($request->hasFile('image')) {
$image = $request->file('image'); //request the file
$fileName = md5($image->getClientOriginalName() . microtime()) . '.' . $image->getClientOriginalExtension(); //use md5 for security reasons and get the extension.
$assortment->image_path = $image->storeAs('','public'); //store the file in the public folder disk.
$assortment->save();
}
EDIT2:如果您使用的是 nginx,则需要删除这些行
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
,
您可以尝试以下方法:
在带有 dd()
语句的代码中包含注释以进行调试 - 如果您无法检查 dd() 语句,请取消注释。
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required','description' => 'required','category_id' => 'required',]);
$user = request()->user();
if(!$user) {
abort(401,'Unauthenticated');
}
$assortment = $user->assortments()->create($validated);
if($request->hasFile('image') && $request->file('image')->isValid()) {
//dd($request->image->store('images','public'));
$assortment->image_path = $request->image->store('images','public');
$assortment->save();
//Check what the Storage::url() generates
//dd(Storage::disk('public')->url($assortment->fresh()->image_path));
} else {
abort(422,"Image not valid");
}
if ($request->wantsJson()) {
return response([],204);
}
return redirect()->route('assortments.show',$assortment->slug)
->with('success','Verzameling is succesvol aangemaakt.');
}
验证您是否在 public
中配置了 config\filesystems.php
磁盘,例如
'public' => [
'driver' => 'local','root' => storage_path('app/public'),'url' => env('APP_URL') . '/storage','visibility' => 'public',],//And links specified for symlinking when php artisan storage:link is run
'links' => [
public_path('storage') => storage_path('app/public'),
然后运行
php artisan storage:link
并检查 public
文件夹中是否存在符号链接的 storage
文件夹
然后在您的刀片视图中,您可以使用
<img src="{{ Storage::disk('public')->url($assortment->image_path) }}" />
//OR
<img src="/storage/{{ $assortment->image_path }}" />
,
控制器:
if ($request->hasFile('image')) {
$image = $request->file('image');
$assortment->image_path = $image->store('','public');
$assortment->save();
}
注意:默认情况下,Laravel 将为文件创建一个唯一名称并为您管理扩展名 - 根据您的用例,您可能不需要自己制作这个文件名。
工匠指挥部
php artisan storage:link
为您的公共存储生成正确的符号链接。
模板
{{ Storage::url($assortment->image_path) }}
这三件事应该可以一起工作。
,试试
<img src="{{ url('storage/images/'.$assortment->image_path) }}"/>
尝试更简化的版本:
if ($request->hasFile('image')) {
$path = $request->file('image')->storePublicly('images'); // Store file in public disk & return path
$assortment->image_path = $path; // If you want filename only,use basename($path)
$assortment->save();
}
之后,您可以在视图中使用 Storage::disk('public')->url($assortment->image_path)
。使用 getClientOriginalExtension()
和 getClientOriginalExtension()
可能不是一个好主意,因为它不被视为安全值 (source)。 Laravel 的 store 方法保存文件并为您返回带有路径的散列文件名,因此您不必担心所有这些:)
确保已创建存储符号链接:
php artisan storage:link
还要确保您的 post_max_size
中的 upload_max_filesize
和 php.ini
设置了足够的数量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。