/** * 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); }