Sending a file via HTTP PUT in PHP

后端 未结 5 1594
孤独总比滥情好
孤独总比滥情好 2020-12-28 22:53

I\'ve been struggling for several hours trying to figure out how to get this work. I\'m trying to send a file via HTTP-PUT to an eXist db. There is user authentication for

相关标签:
5条回答
  • 2020-12-28 23:34

    CURL works for me. Here is snippet from my code,

                    $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: Just updated my code. I don't use authentication myself so this is not tested.

    0 讨论(0)
  • 2020-12-28 23:37

    Aha! After a little "rubber ducking" with the grumpy dwarf stuffed doll on my desk here, I figured out the solution:

            $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 讨论(0)
  • 2020-12-28 23:38

    This works for me...

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

    Many of the header lines are probably not necessary... but it works when I talk to my couchdb so I haven't gotten around to weeding them out.

    0 讨论(0)
  • 2020-12-28 23:39
    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;
        }
    }
    

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

    0 讨论(0)
  • 2020-12-28 23:52

    If your eXist-db has the SOAP interface enabled, there's an open-source library called PheXist that would make interacting with the database easier.

    0 讨论(0)
提交回复
热议问题