/** * Deletes file from storage * * @param string $sFile * * @return bool */ public function Delete($sFile) { if (strpos($sFile, '*')) { $bResult = F::File_DeleteAs($sFile); } else { $bResult = F::File_Delete($sFile); } if ($bResult) { // if folder is empty then remove it if (!F::File_ReadDir($sDir = dirname($sFile))) { F::File_RemoveDir($sDir); } } return $bResult; }
/** * Обработка дополнительных полей топика * * @param ModuleTopic_EntityTopic $oTopic * @param string $sType * * @return bool */ public function processTopicFields($oTopic, $sType = 'add') { /** @var ModuleTopic_EntityContentValues $aValues */ $aValues = array(); if ($sType == 'update') { // * Получаем существующие значения if ($aData = $this->GetTopicValuesByArrayId(array($oTopic->getId()))) { $aValues = $aData[$oTopic->getId()]; } // * Чистим существующие значения E::ModuleTopic()->DeleteTopicValuesByTopicId($oTopic->getId()); } if ($oType = E::ModuleTopic()->GetContentTypeByUrl($oTopic->getType())) { //получаем поля для данного типа if ($aFields = $oType->getFields()) { foreach ($aFields as $oField) { $sData = null; if (isset($_REQUEST['fields'][$oField->getFieldId()]) || isset($_FILES['fields_' . $oField->getFieldId()]) || $oField->getFieldType() == 'single-image-uploader') { //текстовые поля if (in_array($oField->getFieldType(), array('input', 'textarea', 'select'))) { $sData = E::ModuleText()->Parser($_REQUEST['fields'][$oField->getFieldId()]); } //поле ссылки if ($oField->getFieldType() == 'link') { $sData = $_REQUEST['fields'][$oField->getFieldId()]; } //поле даты if ($oField->getFieldType() == 'date') { if (isset($_REQUEST['fields'][$oField->getFieldId()])) { if (F::CheckVal($_REQUEST['fields'][$oField->getFieldId()], 'text', 6, 10) && substr_count($_REQUEST['fields'][$oField->getFieldId()], '.') == 2) { list($d, $m, $y) = explode('.', $_REQUEST['fields'][$oField->getFieldId()]); if (@checkdate($m, $d, $y)) { $sData = $_REQUEST['fields'][$oField->getFieldId()]; } } } } //поле с файлом if ($oField->getFieldType() == 'file') { //если указано удаление файла if (F::GetRequest('topic_delete_file_' . $oField->getFieldId())) { if ($oTopic->getFieldFile($oField->getFieldId())) { @unlink(Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl()); //$oTopic->setValueField($oField->getFieldId(),''); $sData = null; } } else { //если удаление файла не указано, уже ранее залит файл^ и нового файла не загружалось if ($sType == 'update' && isset($aValues[$oField->getFieldId()])) { $sData = $aValues[$oField->getFieldId()]->getValueSource(); } } if (isset($_FILES['fields_' . $oField->getFieldId()]) && is_uploaded_file($_FILES['fields_' . $oField->getFieldId()]['tmp_name'])) { $iMaxFileSize = F::MemSize2Int(Config::Get('module.uploader.files.default.file_maxsize')); $aFileExtensions = Config::Get('module.uploader.files.default.file_extensions'); if (!$iMaxFileSize || filesize($_FILES['fields_' . $oField->getFieldId()]['tmp_name']) <= $iMaxFileSize) { $aPathInfo = pathinfo($_FILES['fields_' . $oField->getFieldId()]['name']); if (!$aFileExtensions || in_array(strtolower($aPathInfo['extension']), $aFileExtensions)) { $sFileTmp = $_FILES['fields_' . $oField->getFieldId()]['tmp_name']; $sDirSave = Config::Get('path.uploads.root') . '/files/' . E::ModuleUser()->GetUserCurrent()->getId() . '/' . F::RandomStr(16); mkdir(Config::Get('path.root.dir') . $sDirSave, 0777, true); if (is_dir(Config::Get('path.root.dir') . $sDirSave)) { $sFile = $sDirSave . '/' . F::RandomStr(10) . '.' . strtolower($aPathInfo['extension']); $sFileFullPath = Config::Get('path.root.dir') . $sFile; if (copy($sFileTmp, $sFileFullPath)) { //удаляем старый файл if ($oTopic->getFieldFile($oField->getFieldId())) { $sOldFile = Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl(); F::File_Delete($sOldFile); } $aFileObj = array(); $aFileObj['file_hash'] = F::RandomStr(32); $aFileObj['file_name'] = E::ModuleText()->Parser($_FILES['fields_' . $oField->getFieldId()]['name']); $aFileObj['file_url'] = $sFile; $aFileObj['file_size'] = $_FILES['fields_' . $oField->getFieldId()]['size']; $aFileObj['file_extension'] = $aPathInfo['extension']; $aFileObj['file_downloads'] = 0; $sData = serialize($aFileObj); F::File_Delete($sFileTmp); } } } else { $sTypes = implode(', ', $aFileExtensions); E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_type', array('types' => $sTypes)), null, true); } } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_size', array('size' => $iMaxFileSize)), null, true); } F::File_Delete($_FILES['fields_' . $oField->getFieldId()]['tmp_name']); } } // Поле с изображением if ($oField->getFieldType() == 'single-image-uploader') { $sTargetType = $oField->getFieldType() . '-' . $oField->getFieldId(); $iTargetId = $oTopic->getId(); // 1. Удалить значение target_tmp // Нужно затереть временный ключ в ресурсах, что бы в дальнейшем картнка не // воспринималась как временная. if ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) { // 2. Удалить куку. // Если прозошло сохранение вновь созданного топика, то нужно // удалить куку временной картинки. Если же сохранялся уже существующий топик, // то удаление куки ни на что влиять не будет. E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); // 3. Переместить фото $sNewPath = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false); $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, 0, E::UserId()); if ($aMresourceRel) { $oResource = array_shift($aMresourceRel); $sOldPath = $oResource->GetFile(); $oStoredFile = E::ModuleUploader()->Store($sOldPath, $sNewPath); /** @var ModuleMresource_EntityMresource $oResource */ $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid()); if ($oResource) { $oResource->setUrl(E::ModuleMresource()->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $iTargetId))); $oResource->setType($sTargetType); $oResource->setUserId(E::UserId()); // 4. В свойство поля записать адрес картинки $sData = $oResource->getMresourceId(); $oResource = array($oResource); E::ModuleMresource()->UnlinkFile($sTargetType, 0, $oTopic->getUserId()); E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $iTargetId); } } } else { // Топик редактируется, просто обновим поле $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel) { $oResource = array_shift($aMresourceRel); $sData = $oResource->getMresourceId(); } else { $sData = false; // $this->DeleteField($oField); } } } E::ModuleHook()->Run('content_field_proccess', array('sData' => &$sData, 'oField' => $oField, 'oTopic' => $oTopic, 'aValues' => $aValues, 'sType' => &$sType)); //Добавляем поле к топику. if ($sData) { /** @var ModuleTopic_EntityContentValues $oValue */ $oValue = E::GetEntity('Topic_ContentValues'); $oValue->setTargetId($oTopic->getId()); $oValue->setTargetType('topic'); $oValue->setFieldId($oField->getFieldId()); $oValue->setFieldType($oField->getFieldType()); $oValue->setValue($sData); $oValue->setValueSource(in_array($oField->getFieldType(), array('file', 'single-image-uploader')) ? $sData : $_REQUEST['fields'][$oField->getFieldId()]); $this->AddTopicValue($oValue); } } } } } return true; }
public function Process() { $bResult = true; foreach ($this->aLinks as $nIdx => $aLinkData) { if (empty($aLinkData['throw']) && !empty($aLinkData['compress'])) { $sAssetFile = $aLinkData['asset_file']; $sExtension = 'min.' . F::File_GetExtension($sAssetFile); $sCompressedFile = F::File_SetExtension($sAssetFile, $sExtension); if (!$this->CheckDestination($sCompressedFile)) { if ($sContents = F::File_GetContents($sAssetFile)) { $sContents = $this->Compress($sContents); if (F::File_PutContents($sCompressedFile, $sContents)) { F::File_Delete($sAssetFile); $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension); if (C::Get('compress.css.gzip') && C::Get('compress.css.merge') && C::Get('compress.css.use')) { // Сохраним gzip $sCompressedContent = gzencode($sContents, 9); F::File_PutContents($sCompressedFile . '.gz.css', $sCompressedContent); } } } } else { $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension); } } } return $bResult; }
/** * Save cache and check-file of current asset pack */ protected function _saveAssets() { $sCheckFileName = $this->GetAssetsCheckName(); F::File_PutContents($sCheckFileName, time(), LOCK_EX, true); $sCacheFileName = $this->GetAssetsCacheName(); F::File_PutContents($sCacheFileName, F::Serialize($this->aAssets), LOCK_EX, true); F::File_Delete($sCacheFileName . '.tmp'); }
/** * Загружаем картинку */ public function EventMultiUpload() { // Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json', FALSE); E::ModuleSecurity()->ValidateSendForm(); // Проверяем, загружен ли файл if (!($aUploadedFile = $this->GetUploadedFile('uploader-upload-image'))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return false; } $sTarget = F::GetRequest('target', FALSE); $sTargetId = F::GetRequest('target_id', FALSE); $oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTarget, $sTargetId); $bTmp = F::GetRequest('tmp', FALSE); $bTmp = $bTmp == 'true' ? true : false; // Проверяем, целевой объект и права на его редактирование if (!$oTarget) { // Здесь два варианта, либо редактировать нельзя, либо можно, но топика еще нет if ($oTarget === TRUE) { // Будем делать временную картинку } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return false; } } // Ошибок пока нет $sError = ''; // Сделаем временный файд $sTmpFile = E::ModuleUploader()->UploadLocal($aUploadedFile); // Вызовем хук перед началом загрузки картинки E::ModuleHook()->Run('uploader_upload_before', array('oTarget' => $oTarget, 'sTmpFile' => $sTmpFile, 'sTarget' => $sTarget)); // Если все ок, и по миме проходит, то if ($sTmpFile && E::ModuleImg()->MimeType($sTmpFile)) { // Проверим, проходит ли по количеству if (!E::ModuleUploader()->GetAllowedCount($sTarget = F::GetRequest('target', FALSE), $sTargetId = F::GetRequest('target_id', FALSE))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('uploader_photoset_error_count_photos', array('MAX' => Config::Get('module.topic.photoset.count_photos_max'))), E::ModuleLang()->Get('error')); return FALSE; } // Определим, существует ли объект или он будет создан позже if (!($sTmpKey = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && $sTargetId == '0' && $bTmp) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return FALSE; } // Пересохраним файл из кэша // Сохраняем фото во временный файл $oImg = E::ModuleImg()->Read($sTmpFile); $sExtension = strtolower(pathinfo($sTmpFile, PATHINFO_EXTENSION)); if (!($sTmpFile = $oImg->Save(F::File_UploadUniqname($sExtension)))) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error')); return FALSE; } // Окончательная запись файла только через модуль Uploader if ($oStoredFile = E::ModuleUploader()->StoreImage($sTmpFile, $sTarget, $sTargetId, null, true)) { /** @var ModuleMresource_EntityMresource $oResource */ //$oResource = $this->AddUploadedFileRelationInfo($oStoredFile, $sTarget, $sTargetId, TRUE); $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid()); $sFile = $oStoredFile->GetUrl(); if ($oResource) { $oResource->setType(ModuleMresource::TYPE_PHOTO); E::ModuleMresource()->UpdateType($oResource); } $sFilePreview = $sFile; if ($sSize = F::GetRequest('crop_size', FALSE)) { $sFilePreview = E::ModuleUploader()->ResizeTargetImage($sFile, $sSize); } // Запускаем хук на действия после загрузки картинки E::ModuleHook()->Run('uploader_upload_image_after', array('sFile' => $sFile, 'sFilePreview' => $sFilePreview, 'sTargetId' => $sTargetId, 'sTarget' => $sTarget, 'oTarget' => $oTarget)); E::ModuleViewer()->AssignAjax('file', $sFilePreview); E::ModuleViewer()->AssignAjax('id', $oResource->getMresourceId()); // Чистим E::ModuleImg()->Delete($sTmpFile); return TRUE; } } else { // Ошибки загрузки картинки $sError = E::ModuleUploader()->GetErrorMsg(); if (!$sError) { $sError = E::ModuleLang()->Get('error_upload_image'); } } // Выведем ошибки пользователю E::ModuleMessage()->AddError($sError, E::ModuleLang()->Get('error')); // Удалим ранее загруженый файл F::File_Delete($sTmpFile); }
protected function _eventLogsErrorDelete($sLogFile) { F::File_Delete($sLogFile); }
/** * Deletes media resources by ID * * @param $aMresources * @param $bDeleteFiles * @param $bNoCheckTargets * * @return bool */ public function DeleteMresources($aMresources, $bDeleteFiles = true, $bNoCheckTargets = false) { $aId = $this->_entitiesId($aMresources); $bResult = true; if ($aId) { if ($bDeleteFiles) { $aMresources = $this->oMapper->GetMresourcesById($aId); if (!$bNoCheckTargets && $aMresources) { /** @var ModuleMresource_EntityMresource $oMresource */ foreach ($aMresources as $oMresource) { // Если число ссылок > 0, то не удаляем if ($oMresource->getTargetsCount() > 0) { $iIdx = array_search($oMresource->getId(), $aId); if ($iIdx !== false) { unset($aId[$iIdx]); } } } } } $bResult = $this->oMapper->DeleteMresources($aId); if ($bDeleteFiles) { if ($bResult && $aMresources && $aId) { // Удаляем файлы foreach ($aId as $nId) { if (isset($aMresources[$nId]) && $aMresources[$nId]->IsFile() && $aMresources[$nId]->CanDelete()) { if ($aMresources[$nId]->IsImage()) { E::ModuleImg()->Delete($aMresources[$nId]->GetFile()); } else { F::File_Delete($aMresources[$nId]->GetFile()); } } } } } } E::ModuleCache()->CleanByTags(array('mresource_update', 'mresource_rel_update')); return $bResult; }
/** * Upload file from client via HTTP POST * * @param array $aFile * @param string $sTarget * @param string $sDir * @param bool $bOriginalName * * @return bool|string */ public function UploadLocal($aFile, $sTarget = 'default', $sDir = null, $bOriginalName = false) { $this->nLastError = 0; if (is_array($aFile) && isset($aFile['tmp_name']) && isset($aFile['name'])) { if ($aFile['error'] === UPLOAD_ERR_OK) { if (is_uploaded_file($aFile['tmp_name'])) { if ($bOriginalName) { $sTmpFile = F::File_GetUploadDir() . $aFile['name']; } else { if (E::UserId()) { $sExtension = dechex(E::UserId()) . '.' . pathinfo($aFile['name'], PATHINFO_EXTENSION); } else { $sExtension = pathinfo($aFile['name'], PATHINFO_EXTENSION); } $sTmpFile = strtolower(basename(F::File_UploadUniqname($sExtension))); } // Copy uploaded file in our temp folder if ($sTmpFile = F::File_MoveUploadedFile($aFile['tmp_name'], $sTmpFile)) { if ($this->_checkUploadedFile($sTmpFile, $sTarget)) { if ($sDir) { $sTmpFile = $this->MoveTmpFile($sTmpFile, $sDir); } return $sTmpFile; } else { F::File_Delete($sTmpFile); } } } else { // Файл не был загружен при помощи HTTP POST $this->nLastError = self::ERR_NOT_POST_UPLOADED; } } else { // Ошибка загузки файла $this->nLastError = $aFile['error']; } } else { $this->nLastError = self::ERR_NOT_FILE_VARIABLE; } return false; }
/** * Удаляет кеш-файл кастомной конфигуации * */ protected static function _deleteCustomCfg() { $sFile = self::_checkCustomCfg(true); if ($sFile) { F::File_Delete($sFile); } }
/** * Save cache and check-file of current asset pack */ protected function _saveAssets() { F::File_PutContents($this->GetAssetsCheckName(), time()); $sFile = $this->GetAssetsCacheName(); F::File_PutContents($sFile, F::Serialize($this->aAssets)); F::File_Delete($sFile . '.tmp'); }
/** * Delete image file and its duplicates * * @param string $sFile * * @return bool */ public function Delete($sFile) { return F::File_Delete($sFile) && $this->DeleteDuplicates($sFile); }
/** * @param int $nStage * @param bool $bFinal */ protected function _stageEnd($nStage, $bFinal = false) { $sFile = F::File_GetAssetDir() . '_check/' . $this->GetHash(); F::File_PutContents($sFile . '.' . $nStage . '.end.tmp', time()); for ($n = 1; $n <= $nStage; $n++) { F::File_Delete($sFile . '.' . $n . '.begin.tmp'); if ($n < $nStage || $bFinal) { F::File_Delete($sFile . '.' . $n . '.end.tmp'); } } }
/** * Загрузка временной картинки фото для последущего ресайза */ protected function EventUploadPhoto() { if (isset($_FILES['foto']) && !isset($_FILES['photo'])) { $_FILES['photo'] = $_FILES['foto']; } // * Устанавливаем формат Ajax ответа $this->Viewer_SetResponseAjax(F::AjaxRequest(true) ? 'json' : 'jsonIframe', false); if (!($aUploadedFile = $this->GetUploadedFile('photo')) && !($aUploadedFile = $this->GetUploadedFile('foto'))) { $this->Message_AddError($this->Lang_Get('settings_profile_photo_error'), $this->Lang_Get('error')); return; } $sError = ''; $sTmpFile = $this->Uploader_UploadLocal($aUploadedFile); if ($sTmpFile && $this->Img_MimeType($sTmpFile)) { /** * Ресайзим и сохраняем уменьшенную копию * Храним две копии - мелкую для показа пользователю и крупную в качестве исходной для ресайза */ $sPreviewFile = $this->Uploader_GetUserAvatarDir($this->oUserCurrent->getId()) . 'photo-preview.' . F::File_GetExtension($sTmpFile, true); if ($sPreviewFile = $this->Img_Copy($sTmpFile, $sPreviewFile, self::PREVIEW_RESIZE, self::PREVIEW_RESIZE)) { // * Сохраняем в сессии временный файл с изображением $this->Session_Set('sPhotoTmp', $sTmpFile); $this->Session_Set('sPhotoPreview', $sPreviewFile); $this->Viewer_AssignAjax('sTmpFile', $this->Uploader_Dir2Url($sPreviewFile)); return; } } else { $sError = $this->Uploader_GetErrorMsg(); if (!$sError) { $sError = $this->Lang_Get('settings_profile_photo_error'); } } $this->Message_AddError($sError, $this->Lang_Get('error')); F::File_Delete($sTmpFile); }
/** * Переименовывает все файлы логов согласно их последовательности * * @param string $sFileName * @param int $iNumberLast */ protected function _rotateRename($sFileName, $iNumberLast) { $aPathInfo = pathinfo($sFileName); $iMaxCount = $this->GetCountForRotate(); $sPathFile = $aPathInfo['dirname'] . '/' . $aPathInfo['filename']; for ($i = $iNumberLast; $i > 0; $i--) { $sFullNameCur = $sPathFile . ".{$i}." . $aPathInfo['extension']; if ($iMaxCount && $iMaxCount <= $i) { F::File_Delete($sFullNameCur); } else { $sFullNameNew = $sPathFile . '.' . ($i + 1) . '.' . $aPathInfo['extension']; rename($sFullNameCur, $sFullNameNew); } } rename($sFileName, $sPathFile . '.1.' . $aPathInfo['extension']); }