从数据库中检索图像并显示 Laravel

时间:2021-01-07 22:45:11

标签: php 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) }}">

但它也没有返回图像。刚回来:

enter image description here

我检查了图片,它返回了以下链接:

http://localhost/storage/tmp/phpSX2W3G

编辑

我现在知道问题与我的上传控制器有关。该文件不应存储在临时路径:/storage//tmp/phpL1ZVcx

编辑 2

存储链接似乎已损坏。在我的 public/storage 中获取此信息:

enter image description here 问候,

帕尔萨

5 个答案:

答案 0 :(得分:1)

你可以使用

<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('', $fileName, 'public'); //store the file in the public folder disk.
    $assortment->save();
} 

EDIT2:如果您使用的是 nginx,则需要删除这些行

        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
               expires 365d;
        }

答案 1 :(得分:1)

您可以尝试以下方法:

在带有 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 }}" />

答案 2 :(得分:0)

控制器:

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

这三件事应该可以一起工作。

答案 3 :(得分:0)

试试 <img src="{{ url('storage/images/'.$assortment->image_path) }}"/>

答案 4 :(得分:0)

尝试更简化的版本:

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_filesizephp.ini 设置了足够的数量。