digitorum.ru

Как меня найти

Профиль

icq: 4415944

3 способа отправить POST-запрос на php.

php

Общая часть кода.

<?php
	// данные для запроса
	$postData = array(
		'foo' => 'bar',
		'hello' => 'world',
		'am-i?' => 'digitorum'
	);
	
	// файлы для отправки
	$files = array(
		'mp3File' => $_SERVER['DOCUMENT_ROOT'] . '/files/html5audio-sample/Lolishit-Schoolgirl_With_Hair-Drills.mp3',
		'jpgFile' => $_SERVER['DOCUMENT_ROOT'] . '/files/html5audio-sample/Lolishit_79178_5b2a2216f82b4dfb.jpg'
	);
	
	// получить миме тип файла
	function getMimeType($filename) {
		if(function_exists('finfo_open')) {
			$finfo = finfo_open(FILEINFO_MIME_TYPE);
			$mime = finfo_file($finfo, $filename);
			finfo_close($finfo);
			return $mime;
		}
		return 'application/octet-stream';
	}
	
	// получить контент для запроса
	function getContent($postData, $files) {
		global $postData, $files;
				
		// "засечка" :P
		$boundary = md5(rand(0,32000));
		
		// контент для отправки
		$content = '';
		
		// данные для отправки
		foreach($postData as $key => $val) { 
			$content .= '--' . $boundary . "\n"; 
			$content .= 'Content-Disposition: form-data; name="' . $key . '"' . "\n\n" . $val . "\n"; 
		}
		
		// файлы для отправки
		foreach($files as $key => $file) { 
			$content .= '--' . $boundary . "\n"; 
			$content .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . basename($file) . '"' . "\n"; 
			$content .= 'Content-Type: ' . getMimeType($file) . "\n"; 
			$content .= 'Content-Transfer-Encoding: binary' . "\n\n"; 
			$content .= file_get_contents($file) . "\n"; 
		}
		
		// завершаем контент
		$content .= "--$boundary--\n";
		
		return array($boundary, $content);
	}

 

1. Очевидный.

Через открытие сокета на 80-й порт.

<?php
	// получаем данные для запроса
	list($boundary, $content) = getContent($postData, $files);
	// формируем правильный запрос
	$content  = 'POST /system/php/Scripts/Dev/fileReceiver-php.php  HTTP/1.1' . "\n"
				. 'Host:' . $_SERVER['HTTP_HOST'] . "\n"
				. 'Content-Type: multipart/form-data; boundary=' . $boundary . "\n"
				. 'Content-Length: ' . strlen($content) . "\n"
				. 'Connection: close' 
				. "\n\n"
				. $content;
	// ошибка подключения
	$errno = 0;
	$errstr = '';
	// ответ
	$responce = '';
	// подключаемся
	if(!($socket = fsockopen($_SERVER['HTTP_HOST'], 80, $errno, $errstr, 15))) {
		die('FAIL!');
	}
	// отправляем данные
	fwrite($socket, $content);
	// получаем ответ
	while (!feof($socket)) {
		$responce .= fgets($socket, 128);
	}
	// закрываем соединение
	fclose($socket);
	
	var_export($responce);

 

2. Самый простой.

С помощью curl.

<?php
	// дополняем массив с данными файлами
	foreach($files as $k => $file) {
		$postData[$k] = '@' . $file;
	}
	// создаем подключение
	$ch = curl_init('http://digitorum.ru/system/php/Scripts/Dev/fileReceiver-php.php');
	// устанавлваем даные для отправки
	curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
	// флаг о том, что нужно получить результат
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	// отправляем запрос
	$response = curl_exec($ch);
	// закрываем соединение
	curl_close($ch);
	
	var_export($response);

 

3. Хитрый.

С помошью определения context для file_get_contents().

<?php
	// получаем данные для запроса
	list($boundary, $content) = getContent($postData, $files);
	// отправляем запрос
	$responce = file_get_contents(
		'http://digitorum.ru/system/php/Scripts/Dev/fileReceiver-php.php', 
		false, 
		stream_context_create(
			array(
				'http' => array(
					'method' => 'POST',
					'header' => 'Content-Type: multipart/form-data; boundary=' . $boundary,
					'content' => $content
				)
			)
		)
	);
	
	var_export($responce);