. */ namespace FireflyIII\Console\Commands; use Crypt; use FireflyIII\Models\Attachment; use Illuminate\Console\Command; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Storage; /** * Class ScanAttachments. */ class ScanAttachments extends Command { /** * The console command description. * * @var string */ protected $description = 'Rescan all attachments and re-set the MD5 hash and mime.'; /** * The name and signature of the console command. * * @var string */ protected $signature = 'firefly:scan-attachments'; /** * Execute the console command. */ public function handle() { $attachments = Attachment::get(); $disk = Storage::disk('upload'); /** @var Attachment $attachment */ foreach ($attachments as $attachment) { $fileName = $attachment->fileName(); try { $content = $disk->get($fileName); } catch (FileNotFoundException $e) { $this->error(sprintf('Could not find data for attachment #%d', $attachment->id)); continue; } try { $decrypted = Crypt::decrypt($content); } catch (DecryptException $e) { $this->error(sprintf('Could not decrypt data of attachment #%d', $attachment->id)); continue; } $tmpfname = tempnam(sys_get_temp_dir(), 'FireflyIII'); file_put_contents($tmpfname, $decrypted); $md5 = md5_file($tmpfname); $mime = mime_content_type($tmpfname); $attachment->md5 = $md5; $attachment->mime = $mime; $attachment->save(); $this->line(sprintf('Fixed attachment #%d', $attachment->id)); } } }