Невозможно отправить файлы на сторонний сервер с помощью php Curl

Я попробовал приведенный ниже код, так как наша версия PHP немного старше 5.4.16, поэтому этот код не работает с этой версией, а также с новым CurlFile($_FILES["upfile"]["tmp_name"], $_FILES["upfile "]["type"], $_FILES["upfile"]["name"]), не работает с php 5.4.16. любая помощь приветствуется

$post = "@" . $_FILES["upfile"]["tmp_name"]
    . ";type=" . $_FILES["upfile"]["type"]
    . ";filename=" . basename($_FILES["upfile"]["name"]);
    echo "<pre>";
    print_r($post);
    echo "</pre>";

    $conn = curl_init('//third party url');

// send a file
    curl_setopt($conn, CURLOPT_POST, true);
    curl_setopt(
        $conn,
        CURLOPT_POSTFIELDS,
        array(
            'file'        => '@' . realpath($_FILES["upfile"]["tmp_name"]),
        )
    );

// output the response
    curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);


// close the session

    $result      = curl_exec($conn);
    $header_info = curl_getinfo($conn, CURLINFO_HEADER_OUT);
    $header_size = curl_getinfo($conn, CURLINFO_HEADER_SIZE);
    $header      = substr($result, 0, $header_size);
    $body        = substr($result, $header_size);
    curl_close($conn);

person Naveenbos    schedule 15.11.2019    source источник


Ответы (2)


'@' . realpath($_FILES["upfile"]["tmp_name"])

Для чего нужен знак @? Для предотвращения ошибок? Это не будет. Он добавит знак at в начале вашего пути к файлу, что приведет к проблеме, что файл не найден. ЕСЛИ вы хотите предотвратить ошибки, вам нужно просто сделать @realpath(...), но не рекомендуется использовать этот оператор.

Удаление должно решить вашу проблему.


Как упоминал Ингус, ваши данные Post также выглядят странно, вам не следует создавать строку запроса самостоятельно, вместо этого используйте http_build_query, встроенную функцию PHP.

Используйте его так:

$post = http_build_query($_POST);

Также под "не работает", что именно вы имеете в виду. Какую ошибку вы получаете?

person Manuel Mannhardt    schedule 15.11.2019
comment
Вся строка $post выглядит хорошо - person Ingus; 15.11.2019
comment
@ManuelMannhardt Я не получаю никаких ошибок, а также код, на который мне ссылались из блога rahulja.in/posts/send-files-using-curl-in-php-54 также я не уверен в php 5.4, как это можно сделать. - person Naveenbos; 15.11.2019
comment
@Ingus Строка сообщения, которую я не использую, забыл ее удалить. - person Naveenbos; 15.11.2019

ИЗМЕНИТЬ попробуйте с этим кодом:
Если это все еще не работает, попробуйте проверить, существует ли файл. ..

$url = '//third party url';
$post = array('file'=> '@'.realpath($_FILES["upfile"]["tmp_name"]));

$conn = curl_init();

curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($conn, CURLOPT_URL, $url);
curl_setopt($conn, CURLOPT_POST,1);
curl_setopt($conn, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($conn, CURLOPT_POSTFIELDS, $post);
curl_setopt($conn, CURLOPT_RETURNTRANSFER, true); //probably can remove
//curl_setopt( $conn, CURLOPT_SSLVERSION, 3); //if still not working try to uncomment this

$result = curl_exec($conn);
$header      = substr($result, 0, $header_size);
$body        = substr($result, $header_size); 

curl_close($conn);

Вот пример того, как я это делаю:
Мой файл в этом примере поступает из базы данных как большой двоичный объект.

$query = mysqli_query($conn, "SELECT name, type, size, content FROM my_files WHERE id='".intval($id)."'");

list($name, $type, $size, $content) = mysqli_fetch_array($query);
$name=html_entity_decode($name, ENT_NOQUOTES, 'UTF-8');


file_put_contents($_SERVER["DOCUMENT_ROOT"].'/temporarylocation/'.$name, $content);

$file_name_with_full_path = realpath($_SERVER["DOCUMENT_ROOT"].'/temporarylocation/'.$name);
$post = array('file'=> '@'.$file_name_with_full_path);

$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_USERPWD, $user.":".$password);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch); 
curl_close($ch);

$resu = json_decode($response, TRUE);

Я надеюсь, что этот код поможет вам! Помните, что это не готовый код. Просто пример. ..

Вот руководство по CURL: https://www.php.net/manual/en/book.curl.php

person Ingus    schedule 15.11.2019
comment
У меня есть рабочий код с PHP версии 7.2, но тот же код не работает с версией 5.4. но это не решит проблему. - person Naveenbos; 15.11.2019
comment
@Naveenbos добавьте ini_set('display_errors', '1'); поверх вашего файла, сообщите нам, какую ошибку он возвращает - person Ingus; 15.11.2019
comment
Я добавил это тоже в файл, к сожалению, ничего не возвращает. - person Naveenbos; 15.11.2019
comment
@Naveenbos также установлен curl на этом устройстве? - person Ingus; 15.11.2019
comment
Да Завиток установлен, поддержка cURL включена Информация о cURL 7.29.0 - person Naveenbos; 15.11.2019
comment
Попробуйте добавить curl_setopt( $conn, CURLOPT_SSLVERSION, 3); и посмотрите, поможет ли это - person Ingus; 15.11.2019
comment
@Naveenbos попробуйте с кодом, который я только что опубликовал в своем ответе - person Ingus; 15.11.2019
comment
Вызов неопределенной функции curl_file_create(), а также когда я использую новый CURLFile PHP Неустранимая ошибка: класс CURLFile не найден - person Naveenbos; 15.11.2019