示例#1
0
 /**
  * Upload Handler
  * 
  * @param array $upload
  * @param array $config
  * @throws UploadException
  */
 protected function _upload($upload, $config)
 {
     // validate upload error
     if ($upload['error'] > 0) {
         throw new UploadException($upload['error']);
     }
     // check upload dir
     if (!is_dir($config['uploadDir']) || !is_writeable($config['uploadDir'])) {
         //$upload['error'] = UPLOAD_ERR_CANT_WRITE;
         debug('MediaUploader: Upload directory is not writeable (' . $config['uploadDir'] . ')');
         throw new UploadException(UPLOAD_ERR_CANT_WRITE);
     }
     // validate size
     if ($upload['size'] < $config['minFileSize']) {
         throw new UploadException(self::UPLOAD_ERR_MIN_FILE_SIZE);
     } elseif ($upload['size'] > $config['maxFileSize']) {
         throw new UploadException(self::UPLOAD_ERR_MAX_FILE_SIZE);
     } elseif (!MediaTools::validateMimeType($upload['type'], $config['allowedMimeType'])) {
         throw new UploadException(self::UPLOAD_ERR_MIME_TYPE);
     }
     // split basename
     list($filename, $ext, $dotExt) = MediaTools::splitBasename(trim($upload['name']));
     //validate extension
     if (!MediaTools::validateFileExtension($ext, $config['allowedFileExtension'])) {
         throw new UploadException(self::UPLOAD_ERR_FILE_EXT);
     }
     // filename
     $filename = Inflector::slug($filename, $config['slug']);
     if ($config['hashFilename']) {
         $filename = sha1($filename);
     }
     $filename = uniqid($filename . '_');
     $basename = $filename . $dotExt;
     $path = $config['uploadDir'];
     //build targetname
     $target = $path . $basename;
     if (file_exists($target) && $config['allowOverwrite'] == false) {
         $i = 0;
         $_filename = $filename;
         do {
             $filename = $_filename . '_' . ++$i;
             $basename = $filename . $dotExt;
             $target = $path . $basename;
         } while (file_exists($target) == true);
     }
     debug("Uploading file to " . $target);
     //move uploaded file to tmp upload dir
     //TODO use a file engine here. Something like $this->_engine->storeTemporaryUpload($upload);
     if (is_uploaded_file($upload['tmp_name'])) {
         if (!move_uploaded_file($upload['tmp_name'], $target)) {
             throw new UploadException(self::UPLOAD_ERR_STORE_UPLOAD);
         }
     } elseif (!copy($upload['tmp_name'], $target)) {
         throw new UploadException(self::UPLOAD_ERR_STORE_UPLOAD);
     }
     return array('name' => $upload['name'], 'type' => $upload['type'], 'size' => $upload['size'], 'path' => $target, 'basename' => $basename, 'filename' => $filename, 'ext' => $ext, 'dotExt' => $dotExt);
 }