web-dev-qa-db-ja.com

Laravel 5.4存在する場合はファイルを置き換える

関連するレジストリを変更するときにイメージの更新で発生する小さな不便を解決する必要があります。

レジストリを変更するときに、ディレクトリにある関連ファイルを置き換えたいと思います。

これは私のテーブル構造です:

Schema::create('institutions', function(Blueprint $table)
        {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('initials')->nullable();
            $table->string('description')->nullable();
            $table->string('avatar')->default('default.jpg');
            $table->timestamps();
        });

これは私のコントローラーの更新方法です:

public function update(Request $request, $id)
    {
        //

        $institution = $this->institution->find($id);

        try
        {
            $institution->update($request->all());

            if($request->hasFile('avatar')){
                $avatar = $request->file('avatar');
                $filename = time() . '.' . $avatar->getClientOriginalExtension();
                Image::make($avatar)->resize(250, 205)->save( public_path('uploads/institutions/' . $filename ) );

                $institution->avatar = $filename;
                $institution->save();
            }

            $updated = $institution;

            $message = flash('Institución actualizada correctamente!!!', 'success');

            return redirect()->route('instituciones.index')->with('message', $message);    
        }       

        catch(\Illuminate\Database\QueryException $e)
        { 
            $message = flash('La institución no se actualizó correctamente!!!', 'danger');

            return redirect()->route('institutions.create')->with('message', $message); 
        }   

    }

さまざまな方法を試しましたが、成功しませんでした。

6
Edward Palen

アップロードされた画像は、古い画像を置き換えるために同じファイル名である必要がありますが、この場合、time()メソッドのために置き換えられません。

データベースからファイル名を取得して新しい画像を保存することで、古い画像を削除できます

//find data by id
$institution = $this->institution->find($id);
$filename  = public_path('uploads/institutions/').$institution->avatar;
if(File::exists($filename)) {

  $avatar = $request->file('avatar');
  $filename_new = time() . '.' . $avatar->getClientOriginalExtension();
  Image::make($avatar)->resize(250, 205)->save( public_path('uploads/institutions/' . $filename_new ) );

  //update filename to database
  $institution->avatar = $filename_new;
  $institution->save();    
  //Found existing file then delete
  File::delete($filename);  // or unlink($filename);
}

それが役立つことを願っています

6
Sovary