/** * Check that we have the necessary tools to allow image uploading. * * @return bool */ public static function canUploadImages() { // Is the Uploads directory available and correctly permissioned? if (!Gdn_Upload::canUpload()) { return false; } // Do we have GD? if (!function_exists('gd_info')) { return false; } $GdInfo = gd_info(); // Do we have a good version of GD? $GdVersion = preg_replace('/[a-z ()]+/i', '', $GdInfo['GD Version']); if ($GdVersion < 2) { return false; } return true; }
/** * * * @param PostController $Sender * @param array $Args */ public function postController_editorUpload_create($Sender, $Args = array()) { // @Todo Move to a library/functions file. require 'generate_thumbnail.php'; // Grab raw upload data ($_FILES), essentially. It's only needed // because the methods on the Upload class do not expose all variables. $fileData = Gdn::request()->getValueFrom(Gdn_Request::INPUT_FILES, $this->editorFileInputName, false); $discussionID = $Sender->Request->post('DiscussionID') ? $Sender->Request->post('DiscussionID') : ''; // JSON payload of media info will get sent back to the client. $json = array('error' => 1, 'feedback' => 'There was a problem.', 'errors' => array(), 'payload' => array()); // New upload instance $Upload = new Gdn_Upload(); // This will validate, such as size maxes, file extensions. Upon doing // this, $_FILES is set as a protected property, so all the other Gdn_Upload methods work on it. $tmpFilePath = $Upload->validateUpload($this->editorFileInputName); // Get base destination path for editor uploads $this->editorBaseUploadDestinationDir = $this->getBaseUploadDestinationDir(); // Pass path, if doesn't exist, will create, and determine if valid. $canUpload = Gdn_Upload::canUpload($this->editorBaseUploadDestinationDir); if ($tmpFilePath && $canUpload) { $fileExtension = strtolower($Upload->getUploadedFileExtension()); $fileName = $Upload->getUploadedFileName(); list($tmpwidth, $tmpheight, $imageType) = getimagesize($tmpFilePath); // This will return the absolute destination path, including generated // filename based on md5_file, and the full path. It // will create a filename, with extension, and check if its dir can be writable. $absoluteFileDestination = $this->getAbsoluteDestinationFilePath($tmpFilePath, $fileExtension); // Save original file to uploads, then manipulate from this location if // it's a photo. This will also call events in Vanilla so other plugins can tie into this. if (empty($imageType)) { $filePathParsed = $Upload->saveAs($tmpFilePath, $absoluteFileDestination, array('source' => 'content')); } else { $filePathParsed = Gdn_UploadImage::saveImageAs($tmpFilePath, $absoluteFileDestination, '', '', array('SaveGif' => true)); $tmpwidth = $filePathParsed['Width']; $tmpheight = $filePathParsed['Height']; } // Determine if image, and thus requires thumbnail generation, or simply saving the file. // Not all files will be images. $thumbHeight = ''; $thumbWidth = ''; $imageHeight = ''; $imageWidth = ''; $thumbPathParsed = array('SaveName' => ''); $thumbUrl = ''; // This is a redundant check, because it's in the thumbnail function, // but there's no point calling it blindly on every file, so just check here before calling it. $generate_thumbnail = false; if (in_array($fileExtension, array('jpg', 'jpeg', 'gif', 'png', 'bmp', 'ico'))) { $imageHeight = $tmpheight; $imageWidth = $tmpwidth; $generate_thumbnail = true; } // Save data to database using model with media table $Model = new Gdn_Model('Media'); // Will be passed to model for database insertion/update. All thumb vars will be empty. $Media = array('Name' => $fileName, 'Type' => $fileData['type'], 'Size' => $fileData['size'], 'ImageWidth' => $imageWidth, 'ImageHeight' => $imageHeight, 'ThumbWidth' => $thumbWidth, 'ThumbHeight' => $thumbHeight, 'InsertUserID' => Gdn::session()->UserID, 'DateInserted' => date('Y-m-d H:i:s'), 'StorageMethod' => 'local', 'Path' => $filePathParsed['SaveName'], 'ThumbPath' => $thumbPathParsed['SaveName']); // Get MediaID and pass it to client in payload. $MediaID = $Model->save($Media); $Media['MediaID'] = $MediaID; if ($generate_thumbnail) { $thumbUrl = url('/utility/mediathumbnail/' . $MediaID, true); } $payload = array('MediaID' => $MediaID, 'Filename' => htmlspecialchars($fileName), 'Filesize' => $fileData['size'], 'FormatFilesize' => Gdn_Format::bytes($fileData['size'], 1), 'type' => $fileData['type'], 'Thumbnail' => '', 'FinalImageLocation' => '', 'Parsed' => $filePathParsed, 'Media' => (array) $Media, 'original_url' => $Upload->url($filePathParsed['SaveName']), 'thumbnail_url' => $thumbUrl, 'original_width' => $imageWidth, 'original_height' => $imageHeight); $json = array('error' => 0, 'feedback' => 'Editor received file successfully.', 'payload' => $payload); } // Return JSON payload echo json_encode($json); }