通过PUT将文件发送到codeigniter REST_Controller

时间:2014-02-04 11:47:29

标签: php codeigniter rest curl put

我正在尝试通过PUT将一些文件上传到网络服务器。

我在服务器端使用Phil Sturgeon的REST库。

客户端是一个使用curl生成请求的PHP应用程序。

...
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch,CURLOPT_INFILE,$fp);
curl_setopt($ch,CURLOPT_INFILESIZE,$fsize);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$headarray = array();
if ($api_key)
    $headarray[] = 'X-API-KEY:'.$api_key;
$headarray[] = "Content-Type: application/octet-stream";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headarray);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_exec($ch);
...

正在接收数据。 但是,当我在服务器端查看$ this-> put()时,我得到一个看起来像我的输入文件被解析的数组。我希望整个文件作为一个字符串提供,作为原始数据。

我尝试使用fopen("php://input", "r");代替,但它是空白的。据推测,这已经被REST库使用了。

我在使用curl之前没有写过PUT请求,所以可能在这方面出了点问题。

是否有替代$ this-> put(),它将为我提供原始输入而不是数组。

似乎我可能必须将我的文件放入参数中,如果是这样,当我使用CURLOPT_INFILE时如何使用curl?我希望能够发送大文件而不会遇到php的内存限制。

1 个答案:

答案 0 :(得分:1)

多么糟糕......你可以在这里看到罪犯:

REST_Controller.php - line~950

protected function _parse_put()
{
    // It might be a HTTP body
    if ($this->request->format)
    {
        $this->request->body = file_get_contents('php://input');
    }

    // If no file type is provided, this is probably just arguments
    else
    {
        parse_str(file_get_contents('php://input'), $this->_put_args);
    }

}

if可以完全按照您的意愿执行:将原始内容转储到$this->request->body。但是,这个if没有被点击,所以parse_str执行了下划线,并将结果作为键添加到$this->put()数组中没有价值(所以array_flip也不起作用)。哇。

我似乎无法找到让库找到$this->request->format的方法;如果你添加你正在使用的内容类型或更改cURL标题中的内容类型,我们会得到一个堆栈跟踪

Fatal error:  Uncaught exception 'Exception' with message 'Format class does not support conversion from "stream".' in /Users/mycpu/Sites/ci-rest/application/libraries/Format.php:51
Stack trace:
#0 /Users/mycpu/Sites/ci-rest/application/libraries/Format.php(31): Format->__construct('Lorem ipsum Ut ...', 'stream')
#1 /Users/mycpu/Sites/ci-rest/application/libraries/REST_Controller.php(251): Format->factory('Lorem ipsum Ut ...', 'stream')
#2 /Users/mycpu/Sites/ci-rest/system/core/CodeIgniter.php(308): REST_Controller->__construct()
#3 /Users/mycpu/Sites/ci-rest/index.php(202): require_once('/Users/mycpu...')
#4 {main}
  thrown in /Users/mycpu/Sites/ci-rest/application/libraries/Format.php on line 51

我能看到解决此问题的最简单方法是将parse_str行改为

array_push($this->_put_args, file_get_contents('php://input'));

然后可以通过

获得纯粹的php://input
$p = $this->put();
$p[0];//contents of file

希望这至少可以帮助您朝着正确的方向前进。