Для передачи файла и данных с одного сервера на другой с использованием PHP и cURL, вам необходимо использовать массив `CURLFile` для передачи файлов и обычные массивы для передачи данных. Ниже представлен пример кода, который демонстрирует, как это сделать.
Предположим, у вас есть файл, который вы хотите отправить, и некоторые дополнительные данные. Мы будем использовать cURL для отправки POST-запроса на второй сервер.
### 1. Код отправляющего сервера
Вот пример кода, который вы можете использовать на отправляющем сервере:
```php
<?php
// Путь к файлу, который вы хотите отправить
$filePath = '/path/to/your/file.txt';
// Проверяем, существует ли файл
if (!file_exists($filePath)) {
die("Файл не найден.");
}
// Подготовка данных для отправки
$data = [
'field1' => 'значение1', // Первое значение
'field2' => 'значение2', // Второе значение
'file' => new CURLFile($filePath) // Загружаем файл
];
// Инициализация cURL
$ch = curl_init();
// Указываем URL сервера, куда будем отправлять данные
curl_setopt($ch, CURLOPT_URL, 'http://example.com/receive.php');
// Указываем, что это POST-запрос
curl_setopt($ch, CURLOPT_POST, true);
// Указываем данные для отправки
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Указываем, что нужно возвращать ответ как строку
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Выполняем запрос
$response = curl_exec($ch);
// Закрываем cURL сеанс
curl_close($ch);
// Выводим ответ
echo $response;
?>
```
### 2. Код принимающего сервера
Теперь вам нужно написать код на принимающем сервере (например, `receive.php`), который будет обрабатывать полученные данные:
```php
<?php
// Проверяем, были ли загружены файлы
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Обрабатываем данные из $_POST
$field1 = $_POST['field1'] ?? null;
$field2 = $_POST['field2'] ?? null;
// Обрабатываем файл из $_FILES
if (isset($_FILES['file'])) {
$file = $_FILES['file'];
// Проверяем, нет ли ошибок при загрузке файла
if ($file['error'] === UPLOAD_ERR_OK) {
// Путь, куда файл будет сохранён
$uploadDir = '/path/to/upload/dir/';
$uploadFile = $uploadDir . basename($file['name']);
// Перемещаем загруженный файл в нужную директорию
if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
echo "Файл успешно загружен: $uploadFile\n";
} else {
echo "Ошибка при перемещении загруженного файла.\n";
}
} else {
echo "Ошибка при загрузке файла: " . $file['error'] . "\n";
}
} else {
echo "Файл не загружен.\n";
}
// Выводим полученные данные
echo "Полученные данные:\n";
echo "field1: $field1\n";
echo "field2: $field2\n";
} else {
echo "Не POST-запрос.";
}
?>
```
### Объяснение:
1. **Отправляющий сервер:**
- Мы подготовили массив `$data`, который содержит поля формы и файл, который передается через `CURLFile`.
- Используется `curl_setopt` для настройки cURL и отправки POST-запроса на принимающий сервер.
2. **Принимающий сервер:**
- Обрабатываются данные из `$_POST` и `$_FILES`.
- Проверяется наличие файла и ошибки при загрузке.
- Файл сохраняется на сервере в указанную директорию.
Убедитесь, что у вас есть права на запись в директорию, куда вы собираетесь сохранять загруженные файлы.