Часто для баз данных хостинги дают 30-100 ГБ бесплатно, это можно использовать как отличное файловое хранилище для ваших korni приложений. просто нужен соответствующий “скриптик”.
Вот обычного php пример скрипта, который превращает ваш php сайтик с mysql в append only файловое хранилище (наподобие S3).
// Обработка POST-запроса для загрузки файла if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $fileTempPath = $_FILES['file']['tmp_name']; $originalFileName = basename($_FILES['file']['name']); $fileData = file_get_contents($fileTempPath);
// Получаем группу файла, если она передана, иначе используем значение по умолчанию $fileGroup = isset($_POST['group']) ? $_POST['group'] : 'default_group';
// Подготовка и выполнение SQL-запроса $stmt = $pdo->prepare("INSERT INTO files (file_name, file_data, file_group) VALUES (?, ?, ?)"); if ($stmt->execute([$originalFileName, $fileData, $fileGroup])) { echojson_encode(['status' => 'success', 'message' => 'Файл загружен успешно', 'file' => $originalFileName]); } else { echojson_encode(['status' => 'error', 'message' => 'Не удалось сохранить файл']); }
// Обработка GET-запроса для получения списка файлов или содержимого файла if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (isset($_GET['file_name'])) { // Если указан файл, то возвращаем его содержимое $fileName = basename($_GET['file_name']); // Безопасность: убираем возможные пути $stmt = $pdo->prepare("SELECT file_data FROM files WHERE file_name = ?"); $stmt->execute([$fileName]);
$fileData = $stmt->fetchColumn(); if ($fileData !== false) { echojson_encode(['status' => 'success', 'file_name' => $fileName, 'file_data' => $fileData]); } else { echojson_encode(['status' => 'error', 'message' => 'Файл не найден']); } } else { // Если файл не указан, возвращаем список файлов $fileGroup = isset($_GET['group']) ? $_GET['group'] : null;
// Формирование SQL-запроса $query = "SELECT file_name, file_group FROM files"; if ($fileGroup) { $query .= " WHERE file_group = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$fileGroup]); } else { $stmt = $pdo->query($query); }
Этот скрипт позволяет фактически в одной mysql БД иметь несколько хранилищь (есть “группы файлов”). Если группу не указывать в параметрах - будет использоваться группа по умолчанию.
Настройте БД
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CREATE DATABASE IF NOTEXISTS file_storage;
USE file_storage;
CREATETABLE IF NOTEXISTS files ( id INT AUTO_INCREMENT PRIMARY KEY, file_name VARCHAR(255) NOTNULL, file_data LONGBLOB NOTNULL, file_group VARCHAR(50) DEFAULT'default_group', created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP );
-- Создайте индекс для ускорения выборки CREATE INDEX idx_file_name ON files (file_name); CREATE INDEX idx_file_name_group ON files (file_group, file_name);
Как использовать скрипт:
Настройка базы данных: Убедитесь, что вы правильно указали настройки подключения к базе данных (адрес, имя пользователя и пароль).
Отправка файла через POST-запрос: Вы можете использовать инструмент, такой как Postman, или curl для отправки файла и опциональной группы:
curl -X POST -F 'file=@path_to_your_file' -F 'group=my_group' http://yourserver.com/your_script.php
Получение списка файлов через GET-запрос: Чтобы получить список всех файлов:
curl -X GET http://yourserver.com/your_script.php
Чтобы получить файлы из определенной группы:
curl -X GET 'http://yourserver.com/your_script.php?group=my_group'
Примечания:
Убедитесь, что у вашего сервера достаточно памяти для хранения загружаемых файлов, так как они будут сохраняться в базе данных.
Вы можете расширить функциональность, добавив проверки на типы файлов и ограничения на размеры загружаемых файлов.
Вот пример, как это работает у меня (в примере адрес скрипта изменен)
указываем file_name в GET-запросе: В случае наличия этого параметра, выполняется запрос к базе для получения данных файла.
Запрос на получение данных файла: Если файл найден, он возвращает содержимое. Если файл не найден, возвращает сообщение об ошибке.
Использование basename для безопасности: Это предотвращает возможность атаки с использованием путей к файлам.
Теперь, если вы сделаете GET-запрос с указанием имени файла, получите содержимое этого файла. Если не укажете имя файла, вы получите список всех файлов в базе данных.
1 2
$ curl -X GET https://mapavlov.ru/VS/MySqlFileStor/tmp.php?file_name=Theme2.js | wc -c 13682
Любой сайт по любому пути одним секретным php скриптом превращается в хранилище файлов, в которое можно дописывать и можно выгружать.
Это лучше чем доступ по ftp т.к. в данном случае извне файлы невозможно удалять…
Получить их можно только если откуда-то знать адрес скрипта и уметь.
Система Korni3 может использовать такой способ для синхронизации файлов и ей не важно что в данном скрипте есть версии файла с переименованием т.к., получив файлы, система корни посчитает их хеш и сама их у себя поименует по их содержимому.