如何删除 public 个超过一小时的存储文件?

How to delete public storage files older than last one hour?

我正在处理一个需要从 storage/public/dir_name/ 中删除所有文件的项目。示例文件名为 jIK4uh.png。我应该为此任务使用 cron 作业。这是我正在遵循的方法。

app/console/commands/ClearPublicStorage.png

class ClearPublicStorageCron extends Command {

  protected $signature = 'storage:clear';
  
  public function handle()
  {
      Log::info("Public storage files cleared!");

      // tasks logic here

      $this->info('Cron command run successfully');
  }
}

app/Console/Kernel.php

class Kernel extends ConsoleKernel {
  protected function schedule(Schedule $schedule)
    {
        $schedule->command('storage:clear')->hourly();
    }
}

然后运行php artisan schedule:run

现在如何select所有早于前一小时的文件并按照此策略每小时删除一次?或者任何其他有效的想法来做这些事情?

Laravel 版本:7.30

基本思路是使用 storage lastModified 日期时间

从文件

获取上次修改datetime
$fileTime=Storage::disk('public')->lastModified('dummy.pdf');

$fileModifiedDateTime=Carbon::parse($fileTime);

if(Carbon::now()->gt($fileModifiedDateTime->addHour())){

   //delete file here
}

如果您将文件名存储在数据库中,那么您可以根据文件上传日期删除

已更新

$files = Storage::disk("public")->allFiles("claim-images");
    
foreach ($files as $file) {
   $time = Storage::disk('public')->lastModified($file);
   $fileModifiedDateTime = Carbon::parse($time);
    
   if (Carbon::now()->gt($fileModifiedDateTime->addHour(1))) {
                
        Storage::disk("public")->delete($file);
    }
    
     //storage symbolic link files not required to delete.Still providing here for you reference
    
   if (File::exists(public_path('storage/' . $file))) {
        
         File::delete(public_path('storage/' . $file));
   }
}

这可能对您有所帮助。

首先,我从 temp-files 文件夹中获取所有文件并将它们放入集合中。

遍历集合并将每个文件的上次修改日期和时间与 now()->addHour() 进行比较,如果是旧文件,则文件将被删除。

public function deleteOldFiles() {
    $files = collect(Storage::allFiles('temp-files'));
    $files->each(function ($file) {
         $lastModified =  Storage::lastModified($file);
         $lastModified = Carbon::parse($lastModified);

         if (Carbon::now()->gt($lastModified->addHour())) {
             Storage::delete($file);
         }
     });

    return true;
}