2009-11-07 12 views
8

Przez kilka godzin walczyłem, próbując dowiedzieć się, jak uzyskać tę pracę. Próbuję wysłać plik przez HTTP-PUT do eXist db. Jest uwierzytelniania użytkownika na serwerze, więc starałem się zrobić coś takiego:Wysyłanie pliku przez HTTP PUT w PHP

mam URL gdzie doc ma być putted do Mam nazwę użytkownika i hasło dla istnieć DB Mam zawartość które muszą być wysyłane za pośrednictwem PUT

próbowałem dotarcie do pracy z cURL ale to nie cicho próbowałem używać strumieni PHP, ale ciągle się „błąd 201/utworzonego”, ale plik nie został faktycznie utworzony.

Każda pomoc w tej sprawie byłaby WSPANIAŁA doceniona.

Oto niektóre przykładowy kod Próbowałem za pomocą PHP strumieni

 
     $data = file_get_contents($tmpFile);                          
     $header = array(
      "Authorization: Basic " . base64_encode($this->ci->config->item('ws_login') . ':' . $this->ci->config->item('ws_passwd')), 
      "Content-Type: text/xml" 
     ); 
     $params = array(
      'http' => array(
       'method' => 'PUT', 
       'header' => $header, 
       'content' => $data)); 
     $ctx = stream_context_create($params); 

     $response = file_get_contents($url, false, $ctx); 
+0

Czy możesz podać kod źródłowy? –

Odpowiedz

9

Aha! Po trochę „Rubber ducking” ze złym humorze karłowatej nadziewane lalka na moim biurku tutaj, zorientowali się rozwiązanie:

 
     $data = file_get_contents($tmpFile); 
     $params = array(
      'http' => array(
       'method' => 'PUT', 
       'header' => "Authorization: Basic " . 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 == ''); 
+0

Czy możesz wyjaśnić? Czy było to dodanie klucza 'content' lub instrukcji return? –

+0

To była jedna rzecz: zmiana sposobu, w jaki budowałem nagłówek. Nadal muszę tłumić out z file_get_contents, ponieważ zwraca ostrzeżenie, ale mogę z tym żyć do teraz, dopóki nie znajdę lepszego sposobu na uwięzienie go. – GrumpyCanuck

0

Jeśli istnieją-db ma interfejs SOAP włączona, nie ma open source biblioteka nazywa PheXist to ułatwiłoby interakcję z bazą danych.

0
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; 
    } 
} 

z http://www.littlehart.net/atthekeyboard/2008/01/11/how-to-http-put-a-file-somewhere-using-php/

+0

To z mojego własnego bloga i odkryłem, że nie działa poprawnie. ;) – GrumpyCanuck

+1

Nie jestem pewien, czy to jest zabawne, czy smutne, lub jedno i drugie: O –

4

CURL pracuje dla mnie. Oto fragment z mojego kodu,

EDYCJA: Właśnie zaktualizowałem mój kod. Nie korzystam z uwierzytelniania, więc nie jest to testowane.

+0

Nie mogłem uzyskać informacji o uwierzytelnianiu HTTP do pracy z cURL. Czy możesz zaktualizować ten przykład cURL, aby go użyć? – GrumpyCanuck

3

Działa to dla mnie ...

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); 
} 

Wiele linii nagłówka prawdopodobnie nie są konieczne ... ale to działa, gdy rozmawiam z moim CouchDB więc nie dostał się do pielenia wokół ich .