我正在尝试通过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的内存限制。
答案 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
希望这至少可以帮助您朝着正确的方向前进。