gpt4 book ai didi

php - 通过 PUT 将文件发送到 codeigniter REST_Controller

转载 作者:搜寻专家 更新时间:2023-10-31 21:35:18 25 4
gpt4 key购买 nike

我正在尝试通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com