【问题标题】:Laravel 9 - updated picture not show in viewLaravel 9 - 更新后的图片未显示在视图中
【发布时间】:2023-02-23 16:35:55
【问题描述】:

这是我第一次使用 laravel 9,我正在做一些 CRUD,问题是我更新数据的时候。数据在数据库中更新/更改,但我更新的图片未保存在 laravel 文件夹中。谁能帮我?

这是更新代码:

public function edit(Request $request, $id)
{
    $student = Student::findOrFail($id);
    return view('edit', ['editstudent' => $student]);
}

public function update(Request $request, $id)
{
    $student = Student::findOrFail($id);

    if ($request->file('image')) {
        // hapus gambar lama
        Storage::delete('image/' . $student->image);

        // simpan gambar baru
        // $path = $request->file('image')->store('public/image');
        $data = $request->all();
        if ($request->file('image')) {
            $extension = $request->file('image')->getClientOriginalExtension();
            $newName = $request->name . '-' . now()->timestamp . '.' . $extension;
            $path = $request->file('image')->store('image', $newName, 'public');

            $data['image'] = $newName; // Save the filename to the database.
        }
        $student->update($data);
    } else {
        $student->update($request->all());
    }

    $student->update($request->all());
    if ($student) {
        session()->flash('success', 'Data berhasil diubah');
        session()->flash('pesan', 'Data berhasil diubah');
    }

    return redirect('/about');
}

我使更新功能与保存功能有些相同。

观点:

@extends('layouts.templates')
@section('title', 'Detail')
@section('content')
<div class="container">
    <div class="row">
        <h1>Student Detail</h1>
        <div class="my-3">
            <img src="{{ asset('storage/image/'.$student->image) }}" alt="{{ $student->name }}" style="width:100px">
        </div>
        <h3>Nama : {{$student->name}}</h3>
        <h3>Gender :
            @if ($student->gender == 'P')
            Perempuan
            @else
            Laki - laki
            @endif</h3>
        <h3>NIM : {{$student->NIM}}</h3>
        <a href="/about">Back</a>
    </div>
</div>


@endsection

形式:

@extends('layouts.templates')
@section('title', 'Edit Student')
@section('content')


<div class="container">
    <div class="row">
        <div class="col-8 m-auto">
            <h2 class="my-3">Form Edit Student</h2>
            <form action="/update/{{$editstudent->id}}" method="post">
                @csrf
                @method('PUT')
                <div class="form-group">
                    <label for="name">Nama </label>
                    <input name="name" type="text" class="form-control" id="name" aria-describedby="emailHelp"
                        placeholder="Masukkan Nama" value="{{$editstudent->name}}" required>
                </div>
                <div class="form-group">
                    <label for="gender">Gender</label>
                    <select name="gender" id="gender" class="form-control" required>
                        <option value="{{$editstudent->gender}}">{{$editstudent->gender}}</option>
                        @if ($editstudent->gender == 'L')
                        <option value="P">P</option>
                        @else
                        <option value="L">L</option>
                        @endif
                    </select>
                </div>
                <div class="form-group">
                    <label for="NIM">NIM</label>
                    <input name="NIM" type="text" class="form-control" id="NIM" value="{{$editstudent->NIM}}">
                </div>
                <label for="image">Gambar</label>
                <div class="form-group">
                     <img src="{{ asset('storage/image/'.$editstudent->image) }}" alt="{{ $editstudent->name }}" style="width:100px">
                    <input type="file" class="form-control-file" id="image" name="image" value="{{$editstudent->image}}">
                </div>
                <div class="form-group row">
                    <div class="col-sm-10 mb-5">
                        <button type="submit" class="btn btn-primary">Edit</button>
                    </div>
                </div>
            </form>
            <a href="/about">Back</a>
        </div>
    </div>
</div>

@endsection

这是错误 更新前:

The views before update

In database

In laravel Storage

更新后:

Views after update

Database after update

The image don't change in laravel folder

我的观点有误吗?还是更新功能出错?

【问题讨论】:

    标签: php laravel image laravel-9


    【解决方案1】:

    首先,您在表格上缺少enctype="multipart/form-data"

    然后删除公共磁盘上的东西(磁盘信息可以在config/filesystems.php上找到):

    Storage::disk('public')->delete('image/' . $user->image);
    

    使用storeAs 命名:

    ->storeAs('image', $newName, 'public')
    
    public function update(Request $request, User $user)
    {
        $validated = $request->validate([
            'name' => ['required', 'string'],
            'image' => ['sometimes', 'required', 'file', 'image', 'max:1024']
        ]);
    
        if (isset($validated['image'])) {
            $file = $validated['image'];
            $extension = $file->extension();
            $newName = $validated['name'] . '-' . now()->timestamp . '.' . $extension;
            $path = $file->storeAs('image', $newName, 'public');
    
            $validated['image'] = $newName;
    
            Storage::disk('public')->delete('image/' . $user->image);
        }
    
        $user->update($validated);
    
        if ($user) {
            session()->flash('success', 'Data berhasil diubah');
            session()->flash('pesan', 'Data berhasil diubah');
        }
    
        return redirect()->back();
    }
    

    并基于 laravel docs

    但是,请记住getClientOriginalNamegetClientOriginalExtension 方法被认为是不安全的,因为文件名和扩展名可能会被恶意用户篡改。出于这个原因,您通常应该更喜欢 hashNameextension 方法来获取给定文件上传的名称和扩展名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2012-06-20
      • 1970-01-01
      • 2017-02-17
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      相关资源
      最近更新 更多