Passed
Push — dev6 ( 871906...b95c31 )
by Ron
14:50
created

FileTrait::deleteFile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2.108

Importance

Changes 0
Metric Value
eloc 10
c 0
b 0
f 0
dl 0
loc 21
ccs 7
cts 10
cp 0.7
rs 9.9332
cc 2
nc 2
nop 1
crap 2.108
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 2
    protected function getChunk($request, $disk = 'local', $folder = null)
25
    {
26 2
        $this->disk   = $disk;
27 2
        $this->folder = $folder;
28
29 2
        $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
30 2
        $save     = $receiver->receive();
31
32 2
        if($save->isFinished())
33
        {
34 2
            $filename = $this->saveFile($save->getFile());
35
            $status   = [
36 2
                'done'     => 100,
37
                'status'   => true,
38 2
                'filename' => $filename,
39
            ];
40 2
            Log::info('File upload completed', $status);
41
42 2
            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 2
    protected function saveFile(UploadedFile $file)
57
    {
58 2
        $properName = $this->cleanFilename($file->getClientOriginalName());
59 2
        $fileName   = $this->checkForDuplicate($properName);
60
61 2
        Log::info('Saving uploaded file', ['name' => $fileName, 'disk' => $this->disk, 'location' => $this->folder]);
62 2
        $file->storeAs($this->folder, $fileName, $this->disk);
63 2
        return $fileName;
64
    }
65
66
    //  Move a file to a new location
67
    protected function moveFile($fileID, $newDisk, $newFolder)
68
    {
69
        $fileData = FileUploads::find($fileID);
70
71
        $this->disk   = $newDisk;
72
        $this->folder = $newFolder;
73
74
        $newName = $this->checkForDuplicate($fileData->file_name);
75
        Storage::disk($this->disk)->move($fileData->folder.DIRECTORY_SEPARATOR.$fileData['file_name'], $this->folder.DIRECTORY_SEPARATOR.$newName);
76
77
        $fileData->file_name = $newName;
78
        $fileData->folder    = $this->folder;
79
        $fileData->disk      = $this->disk;
80
        $fileData->save();
81
82
        return true;
83
    }
84
85
    //  Sanitize the filename to remove any illegal characters and spaces
86 2
    protected function cleanFilename($name)
87
    {
88 2
        $newName =  str_replace(' ', '_', preg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $name));
89 2
        Log::debug('Cleaned Filename', ['original_name' => $name, 'clean_name' => $newName]);
90
91 2
        return $newName;
92
    }
93
94
    //  Check to see if the file already exists, if so append filename as needed
95 2
    protected function checkForDuplicate($name)
96
    {
97 2
        Log::debug('Checking File '.$name.' to see if it already exists on '.$this->disk.' in the '.$this->folder.' folder');
98
99 2
        if(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name))
100
        {
101
            $parts = pathinfo($name);
102
            $ext   = isset($parts['extension']) ? ('.'.$parts['extension']) : '';
103
            $base  = $parts['filename'];
104
            $number = 0;
105
106
            Log::debug('File exists - updating name '.$base);
107
108
            do
109
            {
110
                $name = $base.'('.++$number.')'.$ext;
111
                Log::debug('Checking to see if updated name exists - '.$name);
112
            } while(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name));
113
        }
114
115 2
        Log::debug('Resulting filename - '.$name);
116 2
        return $name;
117
    }
118
119
    //  Determine if a file is no longer in use, and then delete it from the filesystem
120 1
    protected function deleteFile($fileID)
121
    {
122 1
        $fileData = FileUploads::find($fileID);
123 1
        $file     = $fileData->only(['disk', 'folder', 'file_name']);
124
125
        //  Try to delete the file from the database, if it fails, the file is in use elsewhere
126
        try
127
        {
128 1
            $fileData->delete();
129
        }
130
        catch(QueryException $e)
131
        {
132
            Log::debug('File ID '.$fileID.' is still in use and cannot be deleted');
133
            return false;
134
        }
135
136
        //  Delete the file from file storage
137 1
        Log::alert('File '.$file['folder'].DIRECTORY_SEPARATOR.$file['file_name'].' has been deleted');
138 1
        Storage::disk($file['disk'])->delete($file['folder'].DIRECTORY_SEPARATOR.$file['file_name']);
139
140 1
        return true;
141
    }
142
}
143