Intereting Posts
Visual Composer не показывает конкретные стили страниц Слэш добавлен ко всем моим сообщениям как сравнить две даты в jquery Что более эффективно и почему: одно соединение db на страницу или одно соединение db для каждой функции? Как выбрать бинарное поле? (PHP, MySQL) ОШИБКА: SQLSTATE Никакое соединение не может быть сделано, потому что целевая машина активно отказалась от него php-файл с <? ?> в XAMPP Проверьте статус пользователя, а затем, если все в порядке, проверьте, есть ли admin; с PHP (база данных mysql) Добавить изображение в Facebook с помощью Graph API (позволяет ограниченные фотографии) и добавить еще некоторые функции Запуск php-скрипта в качестве задания cron-timeout? Вопрос с интервью: В php, 123 == 0123? PHP-шифрование с несколькими ключами массив сортировки php по суб-значению Ошибка FQL 102 Требуется сеанс пользователя для повторного запроса Как выбрать год и месяц из атрибутов created_at таблицы базы данных в laravel 5.1?

Отправка файла через HTTP PUT в PHP

Я несколько часов пытаюсь понять, как получить эту работу. Я пытаюсь отправить файл через 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/