Задать вопрос
@foul11

Как загрузить поток файла post запросом curl?

У меня есть некий поток и его надо отправить на сервер через curl методом post, примерно похожую задачу решает опция CURLOPT_INFILE, но она это делает методом put.

Я пробовал решить это через фильтры, но curl говорит, что обёртка не поддерживается.

На данный момент имею:
$curl = curl_init('http://localhost/upload.php');
$file = fopen($name, 'rb');

// curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type" => "multipart/form-data"));
// curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_PUT, TRUE);
curl_setopt($curl, CURLOPT_INFILE, $file);
curl_setopt($curl, CURLOPT_READFUNCTION, function($curl, $in, $max){ return fread($in, $max); });
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$ret = curl_exec($curl);

if(curl_errno($curl)){
	echo 'CURL error:['. curl_errno($curl). '] '. curl_error($curl) .'<br>';
	die();
}

fclose($file);
curl_close($curl);

echo $ret;
  • Вопрос задан
  • 499 просмотров
Подписаться 2 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Stepik
    Язык программирования PHP
    1 неделя
    Далее
Решения вопроса 1
@foul11 Автор вопроса
если кто нибудь сюда придёт за решением, сокеты самое простое, что можно для этого использовать

function uploadFile($desource, $source, $name='file.txt', $field='file'){
	$bodyend = $body = $head =  $out = '';
	$boundary = '-------------'. uniqid();
	
	// $cipher = new \phpseclib3\Crypt\RC4();
	// $cipher->setKey('qwertyuiop');
	
	$source = parse_url($source);
	
	$source['scheme'] = $source['scheme'] == 'http' ? '' : $source['scheme'];
	$source['scheme'] = ($source['scheme'] == 'https' ? 'ssl' : $source['scheme']) . ($source['scheme'] ? '://' : '');
	$source['port'] = $source['port'] ?? ($source['scheme'] == 'ssl://' ? 443 : 80);
	$source['path'] = ($source['path'] ?? '/') . ($source['query'] ? ('?'. $source['query']) : '');
	
	$size = filesize($desource);
	$file = fopen($desource, 'rb');
	$server = fsockopen("{$source['scheme']}{$source['host']}", $source['port']);
	
	$body .= "--$boundary\r\n";
	$body .= "Content-Disposition: form-data; name=\"$field\";  filename=\"$name\"\r\n";
	$body .= "Content-Type: application/octet-stream\r\n\r\n";
	
	$bodyend .= "\r\n";
	$bodyend .=  "--$boundary--\r\n\r\n";
	
	$head .= "POST {$source['path']} HTTP/1.1\r\n";
	$head .= "Host: {$source['host']}\r\n";
	$head .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
	$head .= 'Content-length: '. (strlen($body) + $size + strlen($bodyend)) ."\r\n";
	$head .= "\r\n";
	
	fputs($server, $head);
	fputs($server, $body);
	
	while(!feof($file)){
		// fputs($server, $cipher->encrypt(fread($file, 16384)));
		fputs($server, fread($file, 16384));
	}
	
	fputs($server, $bodyend);
	
	while(!feof($server)) $out .= fread($server, 16384);
	fclose($server);
	
	return $out;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
поток это поток, файл это файл, ты не можешь передать еще не полученное таким макаром. хотяя... если хочешь знаю один извращенный метод чтобы подсунуть стрим курлу, хотя нафига не очень понятно, чего тебе со stream функциями не работается?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы