我想从数据库中删除新闻,当我点击删除按钮时,数据库中的所有数据都被删除但图像仍保留在上传文件夹中。 那么,我该如何工作呢。 感谢
这是我的功能,但不删除公共目录>
的图像/新闻文件夹中的图像 public function destroy($id) {
$news = News::findOrFail($id);
$image_path = app_path("images/news/{$news->photo}");
if (File::exists($image_path)) {
//File::delete($image_path);
unlink($image_path);
}
$news->delete();
return redirect('admin/dashboard')->with('message','خبر موفقانه حذف شد');
}
答案 0 :(得分:27)
你可以像@Khan建议的那样使用PHP的unlink()方法。
但是如果你想以Laravel的方式去做,请改用File :: delete()方法。
//删除单个文件
File::delete($filename);
//删除多个文件
File::delete($file1, $file2, $file3);
//删除文件数组
$files = array($file1, $file2);
File::delete($files);
答案 1 :(得分:16)
使用php的unlink功能,只需将确切路径传递给您的文件即可取消链接功能:
unlink($file_path);
如果文件未存储在数据库中,请不要忘记创建文件的完整路径。 e.g
$file_path = app_path().'/images/news/'.$news->photo;
答案 2 :(得分:8)
这种方法对我有用 首先,将下面的行放在控制器的开头:
use File;
在php文件中的命名空间下面 第二:
$destinationPath = 'your_path';
File::delete($destinationPath.'/your_file');
$ destinationPath - >文件夹public里面的文件夹。
答案 3 :(得分:4)
首先,您应该转到config/filesystems.php
并设置'root' => public_path()
,如下所示:
'disks' => [
'local' => [
'driver' => 'local',
'root' => public_path(),
],
然后,您可以使用Storage::delete($filename);
答案 4 :(得分:2)
试一试:Laravel 5.5
public function destroy($id){
$data = User::FindOrFail($id);
if(file_exists('backend_assets/uploads/userPhoto/'.$data->photo) AND !empty($data->photo)){
unlink('backend_assets/uploads/userPhoto/'.$data->photo);
}
try{
$data->delete();
$bug = 0;
}
catch(\Exception $e){
$bug = $e->errorInfo[1];
}
if($bug==0){
echo "success";
}else{
echo 'error';
}
}
答案 5 :(得分:2)
这适用于 Laravel 8
use File;
if (File::exists(public_path('uploads/csv/img.png'))) {
File::delete(public_path('uploads/csv/img.png'));
}
答案 6 :(得分:1)
使用PHP unlink()
函数将删除该文件
$path = public_path()."/uploads/".$from_db->image_name;
unlink($path);
以上内容将删除位于$from_db->image_name
文件夹中的public/uploads
返回的图像
答案 7 :(得分:1)
public function destroy($id) {
$news = News::findOrFail($id);
$image_path = app_path("images/news/".$news->photo);
if(file_exists($image_path)){
//File::delete($image_path);
File::delete( $image_path);
}
$news->delete();
return redirect('admin/dashboard')->with('message','خبر موفقانه حذف شد');
}
答案 8 :(得分:1)
更新适用于Laravel 8.x:
例如删除图像->
首先在控制器顶部添加文件外观:
use Illuminate\Support\Facades\File;
然后使用删除功能。如果文件位于“ public /”中,则必须使用public_path()函数指定路径:
File::delete(public_path("images/filename.png"));
答案 9 :(得分:1)
这是我上传文件并将其保存到数据库和公用文件夹中的方法,也是我从数据库和公用文件夹中删除文件的方法。
这可以帮助您和学生获得完整的源代码来完成任务。
上传文件
首先,如果您无需再通过delete方法使用路径public_path()
即可将文件保存到数据库中
public function store_file(Request $request)
{
if($request->hasFile('file'))
{
$fileExtention = $request->file('file')->getClientOriginalExtension();
$name = time().rand(999,9999).$request->filename.'.'.$fileExtention;
$filePath = $request->file('file')->move(public_path().'/videos',$name);
$video = new Video_Model;
$video->file_path = $filePath;
$video->filename = $request->filename;
$video->save();
}
return redirect()->back();
}
删除文件
保存时从数据库和公用文件夹中访问
public function delete_file(Request $request)
{
$file = Video_Model::find($request->id);
$file_path = $file->file_path;
if(file_exists($file_path))
{
unlink($file_path);
Video_Model::destroy($request->id);
}
return redirect()->back();
}
答案 10 :(得分:0)
您可以明智地删除文件及其记录:
public function destroy($id)
{
$items = Reports::find($id); //Reports is my model
$file_path = public_path('pdf_uploads').'/'.$items->file; // if your file is in some folder in public directory.
// $file_path = public_path().'/'.$items->file; use incase you didn't store your files in any folder inside public folder.
if(File::exists($file_path)){
File::delete($file_path); //for deleting only file try this
$items->delete(); //for deleting record and file try both
}
return redirect()->back()->with('message','client code: '.$items->receipt_no.' report details has been successfully deleted along with files');
}
注意:items->file 是我在数据库中的属性,我在其中存储了文件名,如下所示,
我已将文件存储在目录“public/pdf_uploads/filename”
不要忘记在标题中添加此内容
use Illuminate\Support\Facades\File;
答案 11 :(得分:0)
public function update(Request $request, $id)
{
$article = Article::find($id);
if($request->hasFile('image')) {
$oldImage = public_path($article->image);
File::delete($oldImage);
$fileName = time().'.'.$request->image->extension();
$request->image->move(public_path('uploads/'), $fileName);
$image ='uploads/'.$fileName;
$article->update([
'image' => $image,
]);
}
$article->update([
'title' => $request->title,
'description' => $request->description,
]);
return redirect()->route('admin.article.index');
}
答案 12 :(得分:0)
对于从文件夹中删除文件,您可以使用 unlink,如果您想从数据库中删除数据,您可以在 laravel 中使用 delete()
从文件夹中删除文件
unlink($image_path);
用于从数据库中删除记录
$flight = Flight::find(1);
$flight->delete();
答案 13 :(得分:0)
它是一个非常旧的线程,但是我看不到解决方案在这里,或者此线程被标记为已解决。我也陷入了我像这样解决的同样问题
$path = public_path('../storage/YOUR_FOLDER_NAME/YOUR_FILE_NAME');
if (!File::exists($path))
{
File::delete(public_path('storage/YOUR_FOLDER_NAME/YOUR_FILE_NAME'));
}
关键是您需要从删除方法中删除“ ..”。请记住,如果您也正在使用存储,那么这是正确的,无论您是否正在使用文件存储,都不要像这样使用它们
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use File; // For File
use Storage; // For Storage
希望它将对某人有所帮助。
答案 14 :(得分:0)
仔细按照步骤操作,首先获取图像=>
$img = DB::table('students')->where('id',$id)->first();
$image_path = $img->photo;
unlink($image_path);
DB::table('students')->where('id',$id)->delete();
答案 15 :(得分:0)
对于从公用文件夹中删除文件,我们可以在Laravel中使用File::delete
函数。要使用File
,需要将use File
插入控制器,或者我们可以使用\File
。这考虑了文件的根。
// Delete a single file
File::delete($filename);
用于删除多个文件
// Delete multiple files
File::delete($file1, $file2, $file3);
删除文件数组
// Delete an array of files
$files = array($file1, $file2);
File::delete($files);
答案 16 :(得分:0)
如果将图像存储在 public 文件夹中,请尝试以下步骤:
例如,您的图片是 sample.jpg ,而您的路径是 public / img / sample.jpg 因此此代码将删除您的图片
readFile
答案 17 :(得分:0)
首先通过构建路径确保文件存在
if($request->hasFile('image')){
$path = storage_path('app/public').'/YOUR_FOLDER/'.$db->image;
if(File::exists($path)){
unlink($path);
}
答案 18 :(得分:0)
删除新闻图片最简单的方法是使用如下所示的模型事件 如果新闻已删除,模型会删除图片
首先,您应该将其导入模型类use Illuminate\Support\Facades\Storage
的顶部
之后,在模型类News
中,您应该这样做
public static function boot(){
parent::boot();
static::deleting(function ($news) {
Storage::disk('public')->delete("{$news->image}");
})
}
或者您可以使用以下命令删除控制器中的图像 该命令
Storage::disk('public')->delete("images/news/{$news->file_name}");
但是您应该知道默认磁盘是公用磁盘,但是如果您在公用文件夹中创建文件夹并放置映像,则应在$news->file_name
之前设置文件夹名称
答案 19 :(得分:0)
尝试使用: 取消关联(存储:: URL($新闻 - &GT '';照片));
在de call o facade Storage之前查看点和连接。
答案 20 :(得分:-2)
从公用文件夹中删除图像的两种方法,无需更改laravel文件系统配置文件或使用纯php unlink函数搞乱:
- 使用默认本地存储,您需要指定公共子文件夹:
醇>
Storage::delete('public/'.$image_path);
- 直接使用公共存储:
醇>
Storage::disk('public')->delete($image_path);
我建议第二种方式作为最佳方式。
希望这有助于其他人。