コード例 #1
0
ファイル: AvatarController.php プロジェクト: Andyyang1981/pi
 /**
  * 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;
 }
コード例 #2
0
ファイル: Doc.php プロジェクト: Andyyang1981/pi
 /**
  * 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;
 }