Я несколько часов пытаюсь понять, как получить эту работу. Я пытаюсь отправить файл через HTTP-PUT в eXist db. Для сервера существует аутентификация пользователя, поэтому я пытался сделать что-то вроде этого:
У меня есть URL, где doc должен быть PUTted, у меня есть имя пользователя и пароль для eXist DB. У меня есть контент, который нужно отправить через PUT
Я попытался работать с cURL, но он не сработает, я попытался использовать потоки PHP, но продолжал получать «error 201 / created», но файл фактически не был создан.
Любая помощь с этим была бы высоко оценена.
Вот пример кода, который я пытался использовать PHP-потоки
$ data = file_get_contents ($ tmpFile); $ header = массив ( «Авторизация: базовая». base64_encode ($ this-> ci-> config-> item ('ws_login'). ':'. $ this-> ci-> config-> item ('ws_passwd')), «Content-Type: text / xml» ); $ params = array ( 'http' => массив ( 'method' => 'PUT', 'header' => $ header, 'content' => $ data)); $ ctx = stream_context_create ($ params); $ response = file_get_contents ($ url, false, $ ctx);
Ага! После небольшого «резинового ныряния» с нахальным карликом на моем столе здесь я понял решение:
$ data = file_get_contents ($ tmpFile); $ params = array ( 'http' => массив ( 'method' => 'PUT', 'header' => «Авторизация: основная». base64_encode ($ this-> ci-> config-> item ('ws_login'). ':'. $ this-> ci-> config-> item ('ws_passwd')). "\ r \ nContent-type: text / xml \ r \ n", 'content' => file_get_contents ($ tmpFile) ) ); $ ctx = stream_context_create ($ params); $ response = @file_get_contents ($ url, false, $ ctx); return ($ response == '');
CURL работает для меня. Вот фрагмент моего кода,
$handle = curl_init ($server_url); if ($handle) { // specify custom header $customHeader = array( "Content-type: $file_type" ); $curlOptArr = array( CURLOPT_PUT => TRUE, CURLOPT_HEADER => TRUE, CURLOPT_HTTPHEADER => $customHeader, CURLOPT_INFILESIZE => $file_size, CURLOPT_INFILE => $file, CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_USERPWD => $user . ':' . $password, CURLOPT_RETURNTRANSFER => TRUE ); curl_setopt_array($handle, $curlOptArr); $ret = curl_exec($handle); $errRet = curl_error($handle); curl_close($handle);
EDIT: просто обновил мой код. Я не использую аутентификацию самостоятельно, поэтому это не проверено.
Это работает для меня …
function put($_server,$_file,$_data) { $fp = @fsockopen ($_server, 80, $errno, $errstr, 30); if ($fp) { $p = "PUT $_file HTTP/1.0\r\n"; $p.= "User-Agent: Mozilla/3.0 (Windows NT 5.0; U) Opera 7.21 [da]\r\n"; $p.= "Host: $_server\r\n"; $p.= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"; $p.= "Accept-Language: da;q=1.0,en;q=0.9\r\n"; $p.= "Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n"; $p.= "Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"; $p.= "Referer: http://www.nasa.gov/secret/flightplans.asp\r\n"; $p.= "Content-type: application/x-www-form-urlencoded\r\n"; $p.= "Content-length: ".strlen($_data)."\r\n"; $p.= "\r\n"; $p.= $_data; //echo($p); fputs ($fp, $p); } else die("dagnabbit : $errstr"); while ($l=fgets($fp)) echo($l); fclose($fp); }
-function put($_server,$_file,$_data) { $fp = @fsockopen ($_server, 80, $errno, $errstr, 30); if ($fp) { $p = "PUT $_file HTTP/1.0\r\n"; $p.= "User-Agent: Mozilla/3.0 (Windows NT 5.0; U) Opera 7.21 [da]\r\n"; $p.= "Host: $_server\r\n"; $p.= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"; $p.= "Accept-Language: da;q=1.0,en;q=0.9\r\n"; $p.= "Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n"; $p.= "Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"; $p.= "Referer: http://www.nasa.gov/secret/flightplans.asp\r\n"; $p.= "Content-type: application/x-www-form-urlencoded\r\n"; $p.= "Content-length: ".strlen($_data)."\r\n"; $p.= "\r\n"; $p.= $_data; //echo($p); fputs ($fp, $p); } else die("dagnabbit : $errstr"); while ($l=fgets($fp)) echo($l); fclose($fp); }
Многие из строк заголовка, вероятно, не нужны … но он работает, когда я разговариваю с моим куддбом, поэтому я не собираюсь их отбирать.
Если в вашем eXist-db включен SOAP-интерфейс, есть библиотека с открытым исходным кодом под названием PheXist , которая упростит взаимодействие с базой данных.
function _publish($service, $doc) { $params = array( 'http' => array( 'method' => 'PUT')); $context = stream_context_create($params); $fp = fopen($service, 'rb', false, $context); $response = fwrite($fp,file_get_contents($doc)); if ($response === false) { return false; } // Pull out the status code from the header $metaData = stream_get_meta_data($fp); preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/", $metaData['wrapper_data'][0], $matches); $code = end($matches[1]); if ($code == 200) { return true; } else { return false; } }
от http://www.littlehart.net/atthekeyboard/2008/01/11/how-to-http-put-a-file-somewhere-using-php/