Синхронизация файлов - php хостинг

Вот обычного php пример скрипта, который превращает ваш php сайтик в append only файловое хранилище (наподобие S3).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
// Указываем директорию, куда будем сохранять файлы
$uploadDir = 'uploads/';

// Убедимся, что директория существует, если нет - создаем её
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}

// Обработка 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']);

// Генерируем случайный постфикс
$randomPostfix = bin2hex(random_bytes(5)); // Генерация постфикса длиной 10 символов
$newFileName = pathinfo($originalFileName, PATHINFO_FILENAME) . '-' . $randomPostfix . '.' . pathinfo($originalFileName, PATHINFO_EXTENSION);

// Путь для сохранения файла
$destinationFilePath = $uploadDir . $newFileName;

// Перемещаем загруженный файл в заданную директорию
if (move_uploaded_file($fileTempPath, $destinationFilePath)) {
echo json_encode(['status' => 'success', 'message' => 'Файл загружен успешно', 'file' => $newFileName]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Не удалось сохранить файл']);
}

exit; // Завершаем выполнение скрипта
} else {
echo json_encode(['status' => 'error', 'message' => 'Ошибка загрузки файла']);
exit;
}
}

// Обработка GET-запроса для получения списка файлов
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$files = array_diff(scandir($uploadDir), array('.', '..')); // Получаем список файлов, исключая . и ..
echo json_encode(['status' => 'success', 'files' => $files]);
exit;
}

?>




<!--
### Как использовать скрипт:

1. *Создание директории*: Убедитесь, что у вас есть директория для загрузки файлов (в данном примере - uploads/). Скрипт автоматически создаст эту директорию, если она не существует.

2. *Отправка файла через POST-запрос*:
- Используйте инструмент, такой как Postman, curl или HTML-форму, чтобы отправить файл на сервер:

bash curl -X POST -F 'file=@path_to_your_file' http://yourserver.com/yor_upload.php

В этом случае замените path_to_your_file на путь к файлу, который вы хотите загрузить.

3. *Получение файла через GET-запрос*:
- Сделайте GET-запрос к вашему скрипту:

bash curl -X GET http://yourserver.com/your_script.php


Скрипт вернёт список загруженных файлов в формате JSON. Каждый раз, когда вы загружаете новый файл, он будет переименован с добавлением случайного постфикса.
-->

Вот пример, как это работает

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# загрузим этот файл (ещё очередной раз)
$ curl -X POST -F 'file=@Theme2.js' https://mapavlov.ru/VS/PhpFileStor/tmp.php | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12912 100 179 100 12733 1098 78116 --:--:-- --:--:-- --:--:-- 79214
{
"status": "success",
"message": "Файл загружен успешно",
"file": "Theme2-181ca179cd.js"
}

# покажи что есть
$ curl -X GET https://mapavlov.ru/VS/PhpFileStor/tmp.php | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 111 100 111 0 0 874 0 --:--:-- --:--:-- --:--:-- 874
{
"status": "success",
"files": {
"2": "Theme2-181ca179cd.js",
"3": "Theme2-b9f490419c.js",
"4": "Theme2-e5844f9a00.js"
}
}

$ curl -X GET https://mapavlov.ru/VS/PhpFileStor/uploads/Theme2-e5844f9a00.js | wc -l
$ curl -X GET https://mapavlov.ru/VS/PhpFileStor/uploads/Theme2-e5844f9a00.js | wc -l
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12532 100 12532 0 0 11100 0 0:00:01 0:00:01 --:--:-- 11090
191

Не нуждается в комментариях. Тут видно что происходит….

Любой сайт по любому пути одним секретным php скриптом превращается в хранилище файлов, в которое можно дописывать и можно выгружать.

Это лучше чем доступ по ftp т.к. в данном случае извне файлы невозможно удалять…

Получить их можно только если откуда-то знать адрес скрипта и уметь.

Система Korni3 может использовать такой способ для синхронизации файлов и ей не важно что в данном скрипте есть версии файла с переименованием т.к., получив файлы, система корни посчитает их хеш и сама их у себя поименует по их содержимому.