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)); |
||
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 | } |