- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过 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 的内存限制。
最佳答案
真是一团糟......你可以在这里看到违规者:
REST_Controller.php - ~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
true;如果您添加您正在使用的内容类型或更改 cURL header 中的内容类型,我们将获得堆栈跟踪
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
希望这至少能帮助您朝着正确的方向前进。
关于php - 通过 PUT 将文件发送到 codeigniter REST_Controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21551638/
我是一名优秀的程序员,十分优秀!