1 | <?php |
||||
2 | |||||
3 | namespace Erykai\Upload; |
||||
4 | |||||
5 | use finfo; |
||||
6 | use RuntimeException; |
||||
7 | use stdClass; |
||||
8 | |||||
9 | /** |
||||
10 | * Class Trait Upload |
||||
11 | */ |
||||
12 | trait TraitUpload |
||||
13 | { |
||||
14 | /** |
||||
15 | * @param string $path |
||||
16 | */ |
||||
17 | protected function createDir(string $path): void |
||||
18 | { |
||||
19 | $folders = explode("/", $path); |
||||
20 | $dir = dirname(__DIR__, 4); |
||||
21 | foreach ($folders as $folder) { |
||||
22 | $dir .= "/" . $folder; |
||||
23 | if (!file_exists($dir) && !mkdir($dir) && !is_dir($dir)) { |
||||
24 | throw new RuntimeException(sprintf('Directory "%s" was not created', $dir)); |
||||
25 | } |
||||
26 | } |
||||
27 | } |
||||
28 | |||||
29 | /** |
||||
30 | * @param string $name |
||||
31 | * @return string |
||||
32 | */ |
||||
33 | protected function slug(string $name): string |
||||
34 | { |
||||
35 | $characters = array( |
||||
36 | 'Š' => 'S', 'š' => 's', 'Đ' => 'Dj', 'đ' => 'dj', 'Ž' => 'Z', 'ž' => 'z', 'Č' => 'C', 'č' => 'c', 'Ć' => 'C', 'ć' => 'c', |
||||
37 | 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', |
||||
38 | 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', |
||||
39 | 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', |
||||
40 | 'à' => 'a', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e', |
||||
41 | 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', |
||||
42 | 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'þ' => 'b', |
||||
43 | 'ÿ' => 'y', 'Ŕ' => 'R', 'ŕ' => 'r', '/' => '-', ' ' => '-' |
||||
44 | ); |
||||
45 | $stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $name); |
||||
46 | return strtolower(strtr($stripped, $characters)); |
||||
47 | } |
||||
48 | |||||
49 | protected function upload(): bool |
||||
50 | { |
||||
51 | foreach ($this->getFiles() as $file) { |
||||
52 | $this->createDir($file->path); |
||||
53 | $archive = $file->name . "." . $file->ext; |
||||
54 | $directory = $file->directory . "/"; |
||||
55 | $path = $file->path . "/"; |
||||
56 | if (file_exists($directory . $archive)) { |
||||
57 | $archive = $file->name . "-" . time() . mt_rand() . "." . $file->ext; |
||||
58 | } |
||||
59 | $this->setData($file->key, $path . $archive); |
||||
60 | if (!empty($file->tmp_name)) { |
||||
61 | move_uploaded_file($file->tmp_name, $directory . $archive); |
||||
62 | }else{ |
||||
63 | file_put_contents($directory . $archive, file_get_contents($this->url)); |
||||
64 | } |
||||
65 | } |
||||
66 | return true; |
||||
67 | } |
||||
68 | |||||
69 | /** |
||||
70 | * @return bool |
||||
71 | */ |
||||
72 | protected function uploadFiles(): bool |
||||
73 | { |
||||
74 | $upload = $_FILES; |
||||
75 | foreach ($upload as $key => $file) { |
||||
76 | $this->file = new stdClass(); |
||||
77 | if (!$this->mimetype($file)) { |
||||
78 | return false; |
||||
79 | } |
||||
80 | $this->mountFile($file, $key); |
||||
81 | $this->file->tmp_name = $file['tmp_name']; |
||||
82 | $files[$key] = (object)$this->file; |
||||
83 | } |
||||
84 | if (!empty($files)) { |
||||
85 | $this->files['upload_file'] = (object)$files; |
||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
![]() |
|||||
86 | return true; |
||||
87 | } |
||||
88 | return false; |
||||
89 | } |
||||
90 | |||||
91 | /** |
||||
92 | * @return bool |
||||
93 | */ |
||||
94 | protected function uploadUrl(): bool |
||||
95 | { |
||||
96 | $this->file = new stdClass(); |
||||
97 | $finfo = new finfo(FILEINFO_MIME_TYPE); |
||||
98 | $mime_type = $finfo->buffer(file_get_contents($this->url)); |
||||
99 | $file['type'] = $mime_type; |
||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||||
100 | |||||
101 | if (!$this->mimetype($file)) { |
||||
102 | return false; |
||||
103 | } |
||||
104 | |||||
105 | $url_array = explode("/", $this->url); |
||||
106 | $file['name'] = end($url_array); |
||||
107 | $this->mountFile($file, $this->key); |
||||
108 | $files = array(); |
||||
109 | $files[$this->key] = (object)$this->file; |
||||
110 | $this->files['upload_url'] = (object)$files; |
||||
111 | return true; |
||||
112 | } |
||||
113 | |||||
114 | /** |
||||
115 | * @param array $file |
||||
116 | */ |
||||
117 | private function mountFile(array $file, string $key) |
||||
118 | { |
||||
119 | [$type] = explode("/", $file['type']); |
||||
120 | $this->setPath($type); |
||||
121 | |||||
122 | $this->file->key = $key; |
||||
123 | $this->file->ext = pathinfo($file['name'], PATHINFO_EXTENSION); |
||||
124 | $this->file->name = $this->slug(pathinfo($file['name'], PATHINFO_FILENAME)); |
||||
0 ignored issues
–
show
It seems like
pathinfo($file['name'], ...load\PATHINFO_FILENAME) can also be of type array ; however, parameter $name of Erykai\Upload\TraitUpload::slug() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
125 | $this->file->path = $this->getPath(); |
||||
126 | $this->file->directory = dirname(__DIR__, 4) . "/" . $this->getPath(); |
||||
127 | } |
||||
128 | |||||
129 | /** |
||||
130 | * @param array $type |
||||
131 | * @return bool |
||||
132 | */ |
||||
133 | private function mimetype(array $type): bool |
||||
134 | { |
||||
135 | if (!in_array($type['type'], $this->getMimeType(), true)) { |
||||
136 | $this->files = null; |
||||
137 | $this->setResponse(400, "error", "invalid file format " . $type['type'], "upload", dynamic: $type['type']); |
||||
138 | return false; |
||||
139 | } |
||||
140 | return true; |
||||
141 | } |
||||
142 | } |