/** * Process upload image by AJAX */ public function uploadAction() { $module = $this->getModule(); $config = Pi::user()->config(''); $result = array('status' => false); $fakeId = $this->params('fake_id', 0); // Checking whether ID is empty if (empty($fakeId)) { $result['message'] = __('Invalid token!'); return $result; } $rawInfo = $this->request->getFiles('upload'); // Rename $ext = strtolower(pathinfo($rawInfo['name'], PATHINFO_EXTENSION)); $rename = $fakeId . '.' . $ext; // Get path to store $location = $this->config('path_tmp') ?: sprintf('upload/%s/tmp', $this->getModule()); //$destination = Pi::path($location); $uploadConfig = Pi::service('avatar')->getOption('upload'); $extension = implode(',', $uploadConfig['extension']); $maxFile = $config['max_size'] ? $config['max_size'] * 1024 : 0; $maxSize = array(); if ($config['max_avatar_width']) { $maxSize['width'] = (int) $config['max_avatar_width']; } if ($config['max_avatar_height']) { $maxSize['height'] = (int) $config['max_avatar_height']; } $upload = new UploadHandler(); $upload->setDestination($location)->setRename($rename)->setExtension($extension); if ($maxFile) { $upload->setSize($maxFile); } if ($maxSize) { $upload->setImageSize($maxSize); } // Get raw file name if (empty($rawInfo)) { $content = $this->request->getContent(); preg_match('/filename="(.+)"/', $content, $matches); $rawName = $matches[1]; } else { $rawName = null; } // Checking whether uploaded file is valid if (!$upload->isValid($rawName)) { $result['message'] = implode(', ', $upload->getMessages()); return $result; } $upload->receive(); //$fileName = $upload->getDestination() . '/' . $rename; $fileName = $location . '/' . $upload->getUploaded(); // Resolve allowed image extension $imageSize = array(); $imageSizeRaw = getimagesize(Pi::path($fileName)); $imageSize['w'] = $imageSizeRaw[0]; $imageSize['h'] = $imageSizeRaw[1]; $uploadInfo = array('tmp_name' => $fileName, 'w' => $imageSize['w'], 'h' => $imageSize['h']); // Save info to session $session = $this->getUploadSession($module, 'avatar'); $session->{$fakeId} = $uploadInfo; // Prepare return data $result['data'] = array_merge(array('originalName' => $rawInfo['name'], 'size' => $rawInfo['size'], 'preview_url' => Pi::url($fileName), 'basename' => basename($fileName), 'type' => $ext, 'id' => $fakeId, 'filename' => $fileName), $imageSize); $result['status'] = true; //return $result; for ie10+ bug Pi::service('log')->mute(); echo json_encode($result); exit; }
/** * Upload a doc and save meta * * @TODO not completed * * @param array $params * @param string $method * * @return int doc id */ public function upload(array $params, $method = 'POST') { @ignore_user_abort(true); @set_time_limit(0); $options = Pi::service('media')->getOption('local', 'options'); $rootUri = $options['root_uri']; $rootPath = $options['root_path']; $path = $options['locator']['path']; if ($path instanceof Closure) { $relativePath = $path(); } else { $relativePath = $path; } $destination = $rootPath . '/' . $relativePath; Pi::service('file')->mkdir($destination); $rename = $options['locator']['file']; $success = false; switch (strtoupper($method)) { // For remote post case 'POST': $uploader = new Upload(array('destination' => $destination, 'rename' => $rename($params['filename']))); $maxSize = Pi::config('max_size', $this->module); if ($maxSize) { $uploader->setSize($maxSize * 1024); } $result = $uploader->isValid(); if ($result) { $uploader->receive(); $filename = $uploader->getUploaded(); if (is_array($filename)) { $filename = current($filename); } // Fetch file attributes $fileinfoList = $uploader->getFileInfo(); $fileinfo = current($fileinfoList); if (!isset($params['mimetype'])) { $params['mimetype'] = $fileinfo['type']; } if (!isset($params['size'])) { $params['size'] = $fileinfo['size']; } $success = true; } break; // For remote put // For remote put case 'PUT': $putdata = fopen('php://input', 'r'); $filename = $rename($params['filename']); $target = $destination . '/' . $filename; $fp = fopen($target, 'w'); while ($data = fread($putdata, 1024)) { fwrite($fp, $data); } fclose($fp); fclose($putdata); $success = true; break; // For local // For local case 'MOVE': $filename = $rename($params['filename']); $target = $destination . '/' . $filename; Pi::service('file')->copy($params['file'], $target); unset($params['file']); $success = true; break; default: break; } if ($success) { $params['url'] = $rootUri . '/' . $relativePath . '/' . $filename; $params['path'] = $rootPath . '/' . $relativePath . '/' . $filename; $result = $this->add($params); } else { $result = 0; } return $result; }