Passed
Push — dev6 ( 1a27fe...681f69 )
by Ron
20:27 queued 10s
created

FileTrait::deleteFile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
c 0
b 0
f 0
dl 0
loc 21
rs 9.9332
cc 2
nc 2
nop 1
1
<?php
2
3
namespace App\Traits;
4
5
use App\Models\FileUploads;
6
use Illuminate\Database\QueryException;
7
use Pion\Laravel\ChunkUpload\Receiver\FileReceiver;
8
use Pion\Laravel\ChunkUpload\Handler\HandlerFactory;
9
10
use Illuminate\Http\UploadedFile;
11
use Illuminate\Support\Facades\Log;
12
use Illuminate\Support\Facades\Auth;
13
use Illuminate\Support\Facades\Storage;
14
15
/**
16
 *  FileTrait will process all uploaded files
17
 */
18
trait FileTrait
19
{
20
    protected $disk;
21
    protected $folder;
22
23
    //  Get an uploaded file chunk
24
    protected function getChunk($request, $disk = 'local', $folder = null)
25
    {
26
        $this->disk   = $disk;
27
        $this->folder = $folder;
28
29
        $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
30
        $save     = $receiver->receive();
31
32
        if($save->isFinished())
33
        {
34
            $filename = $this->saveFile($save->getFile());
35
            $status   = [
36
                'done'     => 100,
37
                'status'   => true,
38
                'filename' => $filename,
39
            ];
40
            Log::info('File upload completed', $status);
41
42
            return $status;
43
        }
44
45
        $handler = $save->handler();
46
        $status  = [
47
            'done' => $handler->getPercentageDone(),
48
            'status' => true
49
        ];
50
51
        Log::debug('File chunk received - ', $status);
52
        return $status;
53
    }
54
55
    //  Save the file to the storage system
56
    protected function saveFile(UploadedFile $file)
57
    {
58
        $properName = $this->cleanFilename($file->getClientOriginalName());
59
        $fileName   = $this->checkForDuplicate($properName);
60
61
        Log::info('Saving uploaded file', ['name' => $fileName, 'disk' => $this->disk, 'location' => $this->folder]);
62
        $file->storeAs($this->folder, $fileName, $this->disk);
63
        return $fileName;
64
    }
65
66
    //  Sanitize the filename to remove any illegal characters and spaces
67
    protected function cleanFilename($name)
68
    {
69
        $newName =  str_replace(' ', '_', preg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $name));
70
        Log::debug('Cleaned Filename', ['original_name' => $name, 'clean_name' => $newName]);
71
72
        return $newName;
73
    }
74
75
    //  Check to see if the file already exists, if so append filename as needed
76
    protected function checkForDuplicate($name)
77
    {
78
        Log::debug('Checking File '.$name.' to see if it already exists on '.$this->disk.' in the '.$this->folder.' folder');
79
80
        if(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name))
81
        {
82
            $parts = pathinfo($name);
83
            $ext   = isset($parts['extension']) ? ('.'.$parts['extension']) : '';
84
            $base  = $parts['filename'];
85
            $number = 0;
86
87
            Log::debug('File exists - updating name '.$base);
88
89
            do
90
            {
91
                $name = $base.'('.++$number.')'.$ext;
92
                Log::debug('Checking to see if updated name exists - '.$name);
93
            } while(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name));
94
        }
95
96
        Log::debug('Resulting filename - '.$name);
97
        return $name;
98
    }
99
100
    //  Determine if a file is no longer in use, and then delete it from the filesystem
101
    protected function deleteFile($fileID)
102
    {
103
        $fileData = FileUploads::find($fileID);
104
        $file     = $fileData->only(['disk', 'folder', 'file_name']);
105
106
        //  Try to delete the file from the database, if it fails, the file is in use elsewhere
107
        try
108
        {
109
            $fileData->delete();
110
        }
111
        catch(QueryException $e)
112
        {
113
            Log::debug('File ID '.$fileID.' is still in use and cannot be deleted');
114
            return false;
115
        }
116
117
        //  Delete the file from file storage
118
        Log::alert('File '.$file['folder'].DIRECTORY_SEPARATOR.$file['file_name'].' has been deleted');
119
        Storage::disk($file['disk'])->delete($file['folder'].DIRECTORY_SEPARATOR.$file['file_name']);
120
121
        return true;
122
    }
123
}
124