Задать вопрос
@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;
  • Вопрос задан
  • 455 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 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 функциями не работается?
Ответ написан
Ваш ответ на вопрос

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

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