2017-06-22 32 views
3

我需要解决一个小的不便之处,当修改相关的注册表时,我正在展示更新的图像。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); 
     } 

    } 

我尝试了多种不同的方法,但我还没有成功。

+0

会发生什么事,当你运行上面的代码?例外? 500错误?请更具体地... – idelara

回答

3

上传的图片必须具有相同的文件名才能替换旧的图片,但在这种情况下,由于采用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); 
} 

希望这将有助于