Passed
Push — master ( 9093f2...a966a4 )
by Taosikai
01:24 queued 17s
created

UploadHandler::clear()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 6
c 1
b 0
f 0
dl 0
loc 11
rs 10
cc 3
nc 3
nop 1
1
<?php
2
3
namespace Slince\Upload;
4
5
use Slince\Upload\Filesystem\FilesystemInterface;
6
use Slince\Upload\Naming\NamerInterface;
7
use Slince\Upload\Processor\ChainProcessor;
8
use Slince\Upload\Processor\ProcessorInterface;
9
use Symfony\Component\HttpFoundation\File\UploadedFile;
10
use Symfony\Component\HttpFoundation\FileBag;
11
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
12
13
class UploadHandler
14
{
15
    /**
16
     * @var NamerInterface
17
     */
18
    protected $namer;
19
20
    /**
21
     * @var FilesystemInterface
22
     */
23
    protected $filesystem;
24
25
    /**
26
     * @var Validator
27
     */
28
    protected $validator;
29
30
    /**
31
     * @var ProcessorInterface
32
     */
33
    protected $processor;
34
35
    /**
36
     * @var boolean
37
     */
38
    protected $overwrite;
39
40
    /**
41
     * @var FileBag
42
     */
43
    protected $uploadedFiles;
44
45
    public function __construct(
46
        FilesystemInterface $filesystem,
47
        NamerInterface $namer,
48
        Validator $validator = null,
49
        ProcessorInterface $processor = null,
50
        bool $overwrite = false
51
    ) {
52
        $this->filesystem = $filesystem;
53
        $this->namer = $namer;
54
        $this->validator = $validator ?: new Validator();
55
        $this->processor = $processor ?: new ChainProcessor();
56
        $this->overwrite = $overwrite;
57
    }
58
59
    /**
60
     * Gets the validator.
61
     *
62
     * @return Validator
63
     */
64
    public function getValidator(): Validator
65
    {
66
        return $this->validator;
67
    }
68
69
    /**
70
     * Gets all uploaded files.
71
     *
72
     * [
73
     *     'file1' => UploadedFile,
74
     *     'file2' => [
75
     *         UploadedFile,
76
     *         UploadedFile
77
     *     ],
78
     * ]
79
     * @return UploadedFile[]
80
     */
81
    public function getUploadedFiles(): array
82
    {
83
        return $this->uploadedFiles->all();
84
    }
85
86
    /**
87
     * Process request
88
     * @param SymfonyRequest|null $request
89
     *
90
     * @return File[]
91
     */
92
    public function handle(?SymfonyRequest $request = null): array
93
    {
94
        return $this->processUploadedFiles($this->createUploadedFiles($request));
95
    }
96
97
    /**
98
     * Clear files
99
     *
100
     * @param File[] $files
101
     * @return bool
102
     */
103
    public function clear(array $files): bool
104
    {
105
        foreach ($files as $file) {
106
            if (is_array($file)) {
107
                $this->clear($file);
108
            } else {
109
                $this->filesystem->delete($file);
110
            }
111
        }
112
113
        return true;
114
    }
115
116
    /**
117
     * @param FileBag|array $uploadedFiles
118
     * @return array
119
     */
120
    protected function processUploadedFiles($uploadedFiles): array
121
    {
122
        $files = [];
123
        foreach ($uploadedFiles as $name => $uploadedFile) {
124
            if (is_array($uploadedFile)) {
125
                $files[$name] = $this->processUploadedFiles($uploadedFile);
126
            } else {
127
                $files[$name] = $this->processUploadedFile($uploadedFile);
128
            }
129
        }
130
        return $files;
131
    }
132
133
    protected function processUploadedFile(UploadedFile $uploadedFile): File
134
    {
135
        $name = $this->namer->generate($uploadedFile);
136
        try {
137
            // validate the file
138
            $this->validator->validate($uploadedFile);
139
            $data = $this->filesystem
140
                ->upload($name, $uploadedFile, $this->overwrite);
141
142
            $file = new File($uploadedFile, $name, true, $data);
143
        } catch (\Exception $exception) {
144
            $file = new File($uploadedFile, $name, false, null, $exception);
145
        }
146
147
        return $this->processor->process($file);
148
    }
149
150
    /**
151
     * @param SymfonyRequest|null $request
152
     * @return FileBag
153
     */
154
    protected function createUploadedFiles(?SymfonyRequest $request = null): FileBag
155
    {
156
        if ($request instanceof SymfonyRequest) {
157
            $files = $request->files;
158
        } else {
159
            $files = new FileBag($_FILES);
160
        }
161
        return $this->uploadedFiles = $files;
162
    }
163
}
164