Задать вопрос
@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;
  • Вопрос задан
  • 490 просмотров
Подписаться 2 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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 функциями не работается?
Ответ написан
Ваш ответ на вопрос

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

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