Заливка файлов с формы

02 Сентября 2021 19:08

 Самый базовый рабочий способ сохранить файл из формы. В коде встречаются элементы кода для системы modx, но их легко можно заменить на свои. Важен сам принцип работы.

// обработка прикреплённых файлов
$allowed_exts = 'jpg,jpeg,png,bmp,webp';
$file_dir = '/userfiles/files';
if (!preg_match('/\/$/', $file_dir)) {
    $file_dir .= '/';
}
if (isset($_FILES['file'])) {
    $file = $_FILES['file'];
    preg_match('/(.*)\.(.*)/', $file['name'], $matches);
    if (count($matches) >= 3) {
        $orig_file_name = $matches[1];
        $orig_file_ext = $matches[2];
        if (in_array($orig_file_ext, explode(',', $allowed_exts))) {
            // транслитерация имени файла. Здесь пример из modx, но можно использовать свой или вообще не использовать
            $translit_class = $_SERVER['DOCUMENT_ROOT'] . '/core/components/translit/model/modx/translit/modtransliterate.class.php';
            if (file_exists($translit_class)) {
                require_once $translit_class;
                $t = new modTransliterate($modx);
                $file_name = $t->translate($orig_file_name, 'russian') . "." . $orig_file_ext;
                $file_name = preg_replace('/[^A-Za-z-_.0-9()]/', '', $file_name);
            } else {
                $n = 0;
                do {
                    $n++;
                    $file_name = $n . "." . $orig_file_ext;
                } while(file_exists($file_dir . $file_name));
            }
            $file_path = $file_dir . $file_name;
            if (move_uploaded_file($file['tmp_name'], $_SERVER['DOCUMENT_ROOT'] . $file_path)) {
                // Сохранение пути файла. Здесь пример для modx, но можно написать свой, например, просто сохранить в базу в нужное поле
                $tv = $modx->getObject('modTemplateVar', array('name' => $file_tv_name));
                $source_id = $tv->get('source');
                $source = $modx->getObject('modMediaSource', $source_id);
                $properties = $source->getProperties();
                $source_path = $properties['basePath']['value'];
                
                // убираем путь до источника файлов и ведущий слеш
                $file_path = str_replace($source_path, '', $file_path);
                $file_path = preg_replace('/^\//', '', $file_path);
                
                $product->setTVValue($file_tv_name, $file_path);
            }
        }
    }
}