Test Setup Failed
Push — dev6 ( 01d104...b652d0 )
by Ron
17:32
created

FileTrait::saveFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 8
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
namespace App\Traits;
4
5
use Pion\Laravel\ChunkUpload\Receiver\FileReceiver;
6
use Pion\Laravel\ChunkUpload\Handler\HandlerFactory;
7
8
use Illuminate\Http\UploadedFile;
9
use Illuminate\Support\Facades\Log;
10
use Illuminate\Support\Facades\Auth;
11
use Illuminate\Support\Facades\Storage;
12
13
/**
14
 *  FileTrait will process all uploaded files
15
 */
16
trait FileTrait
17
{
18
    protected $disk;
19
    protected $folder;
20
21
    //  Get an uploaded file chunk
22
    protected function getChunk($request, $disk = 'local', $folder = null)
23
    {
24
        $this->disk   = $disk;
25
        $this->folder = $folder;
26
27
        $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
28
        $save     = $receiver->receive();
29
30
        if($save->isFinished())
31
        {
32
            $filename = $this->saveFile($save->getFile());
33
            $status   = [
34
                'done'     => 100,
35
                'status'   => true,
36
                'filename' => $filename,
37
            ];
38
            Log::info('File upload completed', $status);
39
40
            return $status;
41
        }
42
43
        $handler = $save->handler();
44
        $status  = [
45
            'done' => $handler->getPercentageDone(),
46
            'status' => true
47
        ];
48
49
        Log::debug('File chunk received - ', $status);
50
        return $status;
51
    }
52
53
    //  Save the file to the storage system
54
    protected function saveFile(UploadedFile $file)
55
    {
56
        $properName = $this->cleanFilename($file->getClientOriginalName());
57
        $fileName   = $this->checkForDuplicate($properName);
58
59
        Log::info('Saving uploaded file', ['name' => $fileName, 'disk' => $this->disk, 'location' => $this->folder]);
60
        $file->storeAs($this->folder, $fileName, $this->disk);
61
        return $fileName;
62
    }
63
64
    //  Sanitize the filename to remove any illegal characters and spaces
65
    protected function cleanFilename($name)
66
    {
67
        $newName =  preg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $name);
68
        Log::debug('Cleaned Filename', ['original_name' => $name, 'clean_name' => $newName]);
69
70
        return $newName;
71
    }
72
73
    //  Check to see if the file already exists, if so append filename as needed
74
    protected function checkForDuplicate($name)
75
    {
76
        Log::debug('Checking File '.$name.' to see if it already exists on '.$this->disk.' in the '.$this->folder.' folder');
77
78
        if(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name))
79
        {
80
            $parts = pathinfo($name);
81
            $ext   = isset($parts['extension']) ? ('.'.$parts['extension']) : '';
82
            $base  = $parts['filename'];
83
            $number = 0;
84
85
            Log::debug('File exists - updating name '.$base);
86
87
            do
88
            {
89
                $name = $base.'('.++$number.')'.$ext;
90
                Log::debug('Checking to see if updated name exists - '.$name);
91
            } while(Storage::disk($this->disk)->exists($this->folder.DIRECTORY_SEPARATOR.$name));
92
        }
93
94
        Log::debug('Resulting filename - '.$name);
95
        return $name;
96
    }
97
}
98