* Create an empty file plus metadata entry. * * @param string $folder * @param string $filename * @param string $uploader * @return array ['success'=>bool, 'error'=>string, 'code'=>int] */
(string $folder, string $filename, string $uploader)
| 3975 | * @return array ['success'=>bool, 'error'=>string, 'code'=>int] |
| 3976 | */ |
| 3977 | public static function createFile(string $folder, string $filename, string $uploader): array |
| 3978 | { |
| 3979 | // 1) basic validation |
| 3980 | $filename = basename(trim($filename)); |
| 3981 | if (!UploadNamePolicy::isAllowedForWrite($filename)) { |
| 3982 | return ['success' => false, 'error' => 'Invalid filename', 'code' => 400]; |
| 3983 | } |
| 3984 | |
| 3985 | $storage = self::storage(); |
| 3986 | |
| 3987 | // 2) resolve target folder |
| 3988 | list($baseDir, $err) = self::resolveFolderPath($folder, true); |
| 3989 | if ($err) { |
| 3990 | return ['success' => false, 'error' => $err, 'code' => ($err === 'Invalid folder name.' ? 400 : 500)]; |
| 3991 | } |
| 3992 | |
| 3993 | $path = $baseDir . DIRECTORY_SEPARATOR . $filename; |
| 3994 | |
| 3995 | // 3) no overwrite |
| 3996 | if ($storage->stat($path) !== null) { |
| 3997 | return ['success' => false, 'error' => 'File already exists', 'code' => 400]; |
| 3998 | } |
| 3999 | |
| 4000 | // 4) touch the file (seed minimal DOCX to keep ONLYOFFICE happy) |
| 4001 | $seed = self::seedFileContents($filename); |
| 4002 | $data = ($seed !== null) ? $seed : ''; |
| 4003 | if (!$storage->write($path, $data, LOCK_EX)) { |
| 4004 | $detail = self::adapterErrorDetail($storage); |
| 4005 | return [ |
| 4006 | 'success' => false, |
| 4007 | 'error' => $detail !== '' ? ('Could not create file: ' . $detail) : 'Could not create file', |
| 4008 | 'code' => 500 |
| 4009 | ]; |
| 4010 | } |
| 4011 | |
| 4012 | // 5) write metadata |
| 4013 | $metaPath = self::getMetadataFilePath($folder); |
| 4014 | |
| 4015 | $collection = []; |
| 4016 | if (file_exists($metaPath)) { |
| 4017 | $json = file_get_contents($metaPath); |
| 4018 | $collection = json_decode($json, true) ?: []; |
| 4019 | } |
| 4020 | |
| 4021 | $now = date(DATE_TIME_FORMAT); |
| 4022 | $collection[$filename] = [ |
| 4023 | 'uploaded' => $now, |
| 4024 | 'modified' => $now, |
| 4025 | 'uploader' => $uploader |
| 4026 | ]; |
| 4027 | |
| 4028 | if (false === file_put_contents($metaPath, json_encode($collection, JSON_PRETTY_PRINT), LOCK_EX)) { |
| 4029 | return ['success' => false, 'error' => 'Failed to update metadata', 'code' => 500]; |
| 4030 | } |
| 4031 | |
| 4032 | return ['success' => true]; |
| 4033 | } |
| 4034 | } |
no test coverage detected