Вызов CURL не загружает файл с локального на удаленный сервер Переполнение стека

Привет у меня есть следующий вызов CURL, который будет загружать локальный текстовый файл в другое место, на данный момент только в localhost (т. Е. Для целей тестирования, как только он будет успешно запущен, я нажму расположение сервера). Но проблема в том, что локальный текстовый файл не публикуется. Есть ли способ POST файл.

НОТА — Я не хочу делать это file_get_contents или же FTP загрузить. Даже я ссылался на другой вопрос, но не решил мою проблему.

<?php
/* CURL Initilization */
$curl = curl_init();
/* Setting the remove URL */
curl_setopt($curl, CURLOPT_URL, 'http://127.0.0.1/php_training/get_curl_call.php');
/* I want to return the transfer and store in data instead of outputing on screen */
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
/* To upload safely */
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
/* Enable sending the data as POST data */
curl_setopt($curl, CURLOPT_POST, true);
/* Sending the data using @ is before 5.5, now I am using curl_file_create */
/* realpath - will get the absolute path of the .txt file */
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'log_file' => curl_file_create(realpath('websites.txt'))
)
);
/* Store the response of curl execution */
$response = curl_exec($curl);
print_r($response, curl_error($curl));
curl_close($curl);

Следующее get_curl_call.php

<?php
// $filename = $_POST['log_file'];
print_r($_POST);exit;

Ниже приводится содержание websites.txt файл

Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201
Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201

Выход из get_curl_call.php

Array ( )

Я не могу исправить, почему файл не загружается. Любая помощь действительно ценится.

0

Решение

Попробуйте следующий код, я обновил его в соответствии с вашими потребностями. Также, когда мы публикуем файл, он не будет отображаться с помощью $_POST как вы делаете, вместо этого, чтобы увидеть файлы, которые нужно распечатать $_FILES

Я не проверял ваш код, но мне кажется, это нормально. Ваша главная ошибка в том, что вы печатаете файл загрузки, используя $_POST, Загрузка файлов доступна в $_FILES массив. Попробуйте напечатать это.

Загрузить файл: (Это совместимо даже с более старыми версиями PHP)
Обратите внимание, что в целях совместимости, когда CURLFile недоступен (для PHP менее 5.5), я использовал file_get_contents.

<?php

$file = "websites.txt";
upload_with_compatibility($file);

function upload_with_compatibility($file){
if (version_compare(phpversion(), '5.5', '>=')) {
echo "Upload will be done using CURLFile\n";
upload($file); //CURL file upload using CURLFile for PHP v5.5 or greater
}else{
echo "Upload will be done without CURLFile\n";
compatibleUpload($file); //CURL file upload without CURLFile for PHP less than v5.5
}
}

//Upload file using CURLFile
function upload($file){
$target = "http://localhost:8888/upload_file.php";
$host = parse_url($target);

$cFile = new CURLFile($file,'text/plain', $file);
$data = array(
'log_file' => $cFile,
);

//you can play around with headers, and adjust as per your need
$agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36';
$curlHeaders = array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding: gzip, deflate',
'Accept-Language: en-US,en;q=0.8',
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36', //change user agent if you want
'Connection: Keep-Alive',
'Pragma: no-cache',
'Referer: http://localhost:8888/upload.php', //you can change referer, if you want or remove it
'Host: ' . $host['host'] . (isset($host['port']) ? ':' . $host['port'] : null), // building host header
'Cache-Control: max-age=0',
'Cookie: __utma=61117235.2020578233.1500534080.1500894744.1502696111.4; __utmz=61117235.1500534080.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', //adjust your cookie if you want
'Expect:  '
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $target);
curl_setopt($curl, CURLOPT_HEADER  , true); //we need header
curl_setopt($curl, CURLOPT_USERAGENT,$agent);
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true); // enable posting
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // post images
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
$r = curl_exec($curl);
if (curl_errno($curl)) {
$error = curl_error($curl);
print_r($error);
} else {
// check the HTTP status code of the request
$resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($resultStatus != 200) {
print_r($resultStatus);
}else{
//successfull
print_r($r);
}
}
curl_close($curl);
}

//Upload file without using CURLFile, because we are upload a file, so we need to generate form boundry
function compatibleUpload($file){
$target = "http://localhost:8888/upload_file.php";
//use this to send any post parameters expect file types
//if you are not sending any other post params expect file, just assign an empty array
// $assoc = array(
//     'name' => 'demo',
//     'status' => '1'
// );
$assoc = array(); //like this

//this array is used to send files
$files = array('log_file' => $file);

static $disallow = array("\0", "\"", "\r", "\n");

// build normal parameters
foreach ($assoc as $k => $v) {
$k = str_replace($disallow, "_", $k);
$body[] = implode("\r\n", array(
"Content-Disposition: form-data; name=\"{$k}\"",
"",
filter_var($v),
));
}

// build file parameters
foreach ($files as $k => $v) {
switch (true) {
case false === $v = realpath(filter_var($v)):
case !is_file($v):
case !is_readable($v):
continue; // or return false, throw new InvalidArgumentException
}
$data = file_get_contents($v);
$v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
$k = str_replace($disallow, "_", $k);
$v = str_replace($disallow, "_", $v);
$body[] = implode("\r\n", array(
"Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
"Content-Type: application/octet-stream",
"",
$data,
));
}

// generate safe boundary
do {
$boundary = "---------------------" . md5(mt_rand() . microtime());
} while (preg_grep("/{$boundary}/", $body));

// add boundary for each parameters
array_walk($body, function (&$part) use ($boundary) {
$part = "--{$boundary}\r\n{$part}";
});

// add final boundary
$body[] = "--{$boundary}--";
$body[] = "";

// set options
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target);
curl_setopt($ch, CURLOPT_HEADER  , true); //we need header
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt_array($ch, array(
CURLOPT_POST       => true,
CURLOPT_POSTFIELDS => implode("\r\n", $body),
CURLOPT_HTTPHEADER => array(
"Expect: ",
"Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type
),
));
$r = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
print_r($error);
} else {
// check the HTTP status code of the request
$resultStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($resultStatus != 200) {
print_r($resultStatus);
}else{
//successfully uploaded
print_r($r);
}
}
curl_close($ch);
}
?>

Загрузка загрузки:

<?php
print_r($_POST); //this will print post varibales expect file types
print_r($_FILES); // this will print files that are posted
?>

Образец, который я пытался загрузить: (website.txt)

Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201
Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201

Вывод результата CURL (версия PHP 5.5 и выше)

Upload will be done using CURLFile
HTTP/1.1 200 OK
Date: Wed, 13 Sep 2017 07:11:07 GMT
Server: Apache
X-Powered-By: PHP/5.5.38
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

Array
(
)
Array
(
[log_file] => Array
(
[name] => websites.txt
[type] => text/plain
[tmp_name] => /Applications/MAMP/tmp/php/phpRp8S4T
[error] => 0
[size] => 245
)

)

Вывод результата CURL (версия PHP меньше 5.5, я тестировал на 5.4.45)

Upload will be done without CURLFile
HTTP/1.1 200 OK
Date: Wed, 13 Sep 2017 07:17:43 GMT
Server: Apache
X-Powered-By: PHP/5.4.45
Transfer-Encoding: chunked
Content-Type: text/html

Array
(
)
Array
(
[log_file] => Array
(
[name] => websites.txt
[type] => application/octet-stream
[tmp_name] => /Applications/MAMP/tmp/php/phpQWGlEG
[error] => 0
[size] => 245
)

)
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector