Самый базовый рабочий способ сохранить файл из формы. В коде встречаются элементы кода для системы 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);
}
}
}
}