Erykai /
upload
| 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) { |
||||||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||||
| 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); |
||||||
|
0 ignored issues
–
show
It seems like
setData() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 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(); |
||||||
|
0 ignored issues
–
show
|
|||||||
| 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
|
|||||||
| 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(); |
||||||
|
0 ignored issues
–
show
|
|||||||
| 97 | $finfo = new finfo(FILEINFO_MIME_TYPE); |
||||||
| 98 | $mime_type = $finfo->buffer(file_get_contents($this->url)); |
||||||
| 99 | $file['type'] = $mime_type; |
||||||
| 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; |
||||||
|
0 ignored issues
–
show
|
|||||||
| 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); |
||||||
|
0 ignored issues
–
show
It seems like
setPath() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 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(); |
||||||
|
0 ignored issues
–
show
It seems like
getPath() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 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)) { |
||||||
|
0 ignored issues
–
show
It seems like
getMimeType() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 136 | $this->files = null; |
||||||
|
0 ignored issues
–
show
|
|||||||
| 137 | $this->setResponse(400, "error", "invalid file format " . $type['type'], "upload", dynamic: $type['type']); |
||||||
|
0 ignored issues
–
show
It seems like
setResponse() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 138 | return false; |
||||||
| 139 | } |
||||||
| 140 | return true; |
||||||
| 141 | } |
||||||
| 142 | } |