За последние 24 часа нас посетили 22953 программиста и 1227 роботов. Сейчас ищут 713 программистов ...

Отправка нескольких файлов с одного сервера на другой

Тема в разделе "PHP для новичков", создана пользователем rugleb, 1 ноя 2017.

  1. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    Задача такая: из формы (обычная html) нужно загрузить к себе на сервер текстовые поля и файлы (несколько) через ajax. Затем отправить эти данные из формы на другой сервер.

    Вот форма:
    HTML:
    1. <form method="post" enctype="multipart/form-data">
    2.     <input type="text" name="name" required />
    3.     <input type="text" name="email" required />
    4.     <input type="file" name="request[]" accept="image" multiple required />
    5. </form>
    JS пропущу, там на сервер отправляется форма и приходит она отлично: $_POST и $_FILES (такой структуры) формируются как надо. Дальше возникает проблема. Нужно, чтобы оба этих массива оказались на другом сервере. Что я делал:

    PHP:
    1.     $name  = $_POST['name'];
    2.     $email  = $_POST['email'];
    3.  
    4.     $url  =  'toOtherServer.com';
    5.  
    6.     $response = [
    7.         'name'  => $name,
    8.         'email' => $email
    9.     ];
    10.  
    11.     $boundary = "--------------------------" . microtime(true);
    12.     $data     = "";
    13.  
    14.     foreach ($response as $key => $value)
    15.     {
    16.         // add some POST fields to the request too: $_POST['foo'] = 'bar'
    17.         $data .= "--{$boundary}\r\n";
    18.         $data .= "Content-Disposition: form-data; name=\"{$key}\"\r\n\r\n{$value}\r\n";
    19.     }
    20.  
    21.     if (isset($_FILES['request'])) {
    22.  
    23.         $uploadDir = 'myDir';             // директория для загрузки
    24.  
    25.         for ($i = 0; $i < count($_FILES['request']['name']); $i++) {
    26.             if ($_FILES['request']['error'][$i] == UPLOAD_ERR_OK) {
    27.                 $fullPath  = "{$uploadDir}/{$_FILES['request']['name'][$i]}";                // полный путь с новым именем и расширением
    28.  
    29.                 if (move_uploaded_file($_FILES['request']['tmp_name'][$i], $fullPath)) {
    30.                     $fileContents = file_get_contents($fullPath);
    31.                     $filename     = basename($fullPath);
    32.  
    33.                     $data .= "--{$boundary}\r\n";
    34.                     $data .= "Content-Disposition: form-data; name=\"request\"; filename=\"{$filename}\"\r\n";
    35.                     $data .= "Content-Type: {$_FILES['request']['type'][$i]}\r\n";
    36.                     $data .= "{$fileContents}\r\n";
    37.                 }
    38.             }
    39.         }
    40.     }
    41.  
    42.     $data .= "--{$boundary}--\r\n";
    43.  
    44.     $opts = ['http' =>
    45.         [
    46.             'method'  => 'POST',
    47.             'timeout' => 60,
    48.             'header'  => '
    49.                         'Referer: MySite\r\n' .
    50.                         'Content-type:multipart/form-data; boundary=' . $boundary . '\r\n' .
    51.                         'Content-Transfer-Encoding: binary\r\n' .
    52.                         'User-Agent: ' . $_SERVER['HTTP_USER_AGENT'] . '\r\n',
    53.                         'content' => $data
    54.        ]
    55.    ];
    56.  
    57.   echo json_encode([file_get_contents (
    58.        $url, false, stream_context_create($opts)
    59.    )]);
    Код упростил, оставил саму суть.
    Искомого результата получить не смог. Видимо я что-то упускаю и/или знаний не хватает. В чем проблема?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    даже не спрашивай в чем проблема.... типа чуть ли в двоичных кодах отправлять .. .можно - но долго, геморойно и очень нужно знать много

    используйте curl для отправки любых данных и все
     
  3. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    нет, дело не в этом. Сейчас у меня получилось это сделать, например, но без заголовка User-agent'a.

    Дайте пжл ссылку, где и файлы можно curl'ом отправить
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    у вас разве синтаксическая ошибка не всплывает ? а то тут бб код даже просветил
     
  5. rugleb

    rugleb Новичок

    С нами с:
    27 ноя 2016
    Сообщения:
    25
    Симпатии:
    0
    Нет, синтаксически все верно. Проблема оказалась в заголовках, оставил только один и все заработало
     
  6. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Оба сервера Ваши? Если да, то первый сервер говорит второму, что вот тут у меня лежат файлы для тебя (передает список имен), а второй сервер их тупо забирает. Не?
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    PHP:
    1. $postData['image'] = '@' . __DIR__ . DIRECTORY_SEPARATOR . '1.png';
    2. $postData['data'] = 'any text';
    3. $ch = curl_init('http://test.local/post.php');
    4. curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    6. curl_setopt($ch, CURLOPT_VERBOSE, true);
    7. $response = curl_exec($ch);
    8. echo $response;
    отправка локального файла с помощью curl