【问题标题】:Sending a file via HTTP PUT in PHP在 PHP 中通过 HTTP PUT 发送文件
【发布时间】:2010-12-14 01:46:51
【问题描述】:

我已经苦苦挣扎了几个小时,试图弄清楚如何完成这项工作。我正在尝试通过 HTTP-PUT 将文件发送到 eXist db。服务器有用户身份验证,所以我试图做这样的事情:

我有将要放置文档的 URL 我有 eXist DB 的用户名和密码 我有需要通过 PUT 发送的内容

我尝试使用 cURL,但它会静默失败 我尝试使用 PHP 流,但一直收到“错误 201/created”,但实际上没有创建文件。

对此的任何帮助将不胜感激。

这是我尝试使用 PHP 流的一些示例代码

$data = file_get_contents($tmpFile); $标头=数组( “授权:基本”。 base64_encode($this->ci->config->item('ws_login') . ':' . $this->ci->config->item('ws_passwd')), “内容类型:文本/xml” ); $参数 = 数组( 'http' => 数组( '方法' => 'PUT', '标头' => $标头, '内容' => $data)); $ctx = stream_context_create($params); $response = file_get_contents($url, false, $ctx);

【问题讨论】:

  • 能否提供一些源代码?

标签: php curl stream http-put


【解决方案1】:

啊哈!在我的办公桌上与脾气暴躁的侏儒毛绒玩偶进行了一些“橡皮擦”之后,我想出了解决方案:

$data = file_get_contents($tmpFile); $参数 = 数组( 'http' => 数组( '方法' => 'PUT', 'header' => "授权:基本" . base64_encode($this->ci->config->item('ws_login') . ':' . $this->ci->config->item('ws_passwd')) 。 "\r\n内容类型:文本/xml\r\n", '内容' => file_get_contents($tmpFile) ) ); $ctx = stream_context_create($params); $response = @file_get_contents($url, false, $ctx); 返回 ($response == '');

【讨论】:

  • 你能解释一下吗?是添加了content 键,还是返回语句?
  • 这是一回事:改变我构建标题的方式。我仍然必须抑制 out of file_get_contents 因为它返回一个警告,但我现在可以忍受它,直到找到更好的方法来捕获它。
【解决方案2】:

CURL 适合我。这是我的代码中的 sn-p,

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

编辑:刚刚更新了我的代码。我自己不使用身份验证,因此未进行测试。

【讨论】:

  • 我无法让 HTTP 身份验证内容与 cURL 一起使用。您可以更新该 cURL 示例以使用它吗?
【解决方案3】:

这对我有用...

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

许多标题行可能不是必需的...但是当我与我的 couchdb 交谈时它会起作用,所以我还没有抽出时间来清除它们。

【讨论】:

    【解决方案4】:

    如果您的 eXist-db 启用了 SOAP 接口,则有一个名为 PheXist 的开源库可以更轻松地与数据库交互。

    【讨论】:

      【解决方案5】:
      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/

      【讨论】:

      • 这来自我自己的博客,我发现它无法正常工作。 ;)
      • 我不确定这是搞笑还是悲伤,或者两者兼而有之:O
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2012-08-13
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多