2009-11-07 18 views
8

He estado luchando durante varias horas tratando de encontrar la manera de hacer este trabajo. Estoy tratando de enviar un archivo a través de HTTP-PUT a un db eXist. No es la autenticación de usuario para el servidor, por lo que estaba tratando de hacer algo como esto:Enviando un archivo a través de HTTP PUT en PHP

tengo la URL donde el doc es a ser entonces a tengo el nombre de usuario y contraseña para el eXist DB Tengo el contenido que necesita ser enviada a través del PUT

he intentado llegar a trabajar con curl pero sería un error silenciosamente he intentado utilizar PHP arroyos, pero mantuvo conseguir "error 201/creado", pero ningún archivo se crea realmente.

Cualquier ayuda con esto sería muy apreciada.

He aquí algunos ejemplos de código He intentado utilizar PHP arroyos

 
     $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

¿Puede proporcionarnos algún código fuente, por favor? –

Respuesta

9

Aha! Después de un poco de "patito de goma" con el enano gruñón muñeco de peluche en mi escritorio aquí, me di cuenta de la solución:

 
     $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

¿Puedes explicarlo? ¿Fue la adición de la clave 'content', o la declaración de devolución? –

+0

Era una cosa: cambiar la forma en que estaba construyendo el encabezado. Todavía tengo que suprimir el archivo fuera de file_get_contents ya que devuelve una advertencia, pero puedo vivir con eso por ahora hasta que encuentre una forma mejor de atraparlo. – GrumpyCanuck

0

Si su eXist-db ha permitido a la interfaz SOAP, hay un código abierto biblioteca llamada PheXist eso facilitaría la interacción con la base de datos.

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

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

+0

Eso es de mi propio blog, y descubrí que no estaba funcionando correctamente. ;) – GrumpyCanuck

+1

No estoy seguro de si eso es hilarante, o triste, o ambas cosas: O –

4

CURL funciona para mí. Aquí se fragmento de mi código,

   $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: Acaba de actualizar mi código. Yo no uso la autenticación por mí mismo, así que esto no se prueba.

+0

yo no era capaz de conseguir las cosas autenticación HTTP para trabajar con rizo. ¿Puedes actualizar ese ejemplo cURL para usarlo? – GrumpyCanuck

3

Esto funciona para mí ...

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

Muchas de las líneas de cabecera probablemente no son necesarios ... pero funciona cuando hablo con mi couchdb así que no he tenido tiempo de escarda a cabo .

Cuestiones relacionadas