如何使用PHP发送带有文件和数据数组的PUT请求

时间:2011-03-29 15:48:10

标签: php rest curl put

我在PHP中设置了一个REST服务和客户端,而且我在使用PUT时遇到了一些麻烦。

这是我的情况: 我正在编写一个应该接受数据和图像数组的REST资源。 REST资源应该更新现有记录,所以我使用PUT。我正在用我编写的PHP curl客户端发送数据。所以 - 就像你将一个HTML多部分表单发送到一个PHP脚本来执行文件上传并接受一些额外的POST字段 - 除了PUT和PHP卷曲之外的情况几乎相同......

Up'到现在为止我一直在发送像这样的PUT请求(伪代码):

$a_some_data = array('name' => 'test', 'user_id' => 4);
$body = http_build_query($a_data);

$fh = fopen('php://memory', 'rw');
fwrite($body);
rewind($fh);

$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_URL => 'http://myapi/resource/someid',
  CURLOPT_PUT => TRUE,
  CURLOPT_INFILE => $fh,
  CURLOPT_INFILESIZE => strlen($body)
  ));
curl_exec($ch);

并像这样读取服务器上的数据:

parse_str(file_get_contents('php://input'), $put_data);

..工作正常。

所以现在我想在混合中添加一个(二进制)文件。 - 我如何在客户端实现这一点? - 我如何处理服务器上的文件?

对于测试,我设置了一个带有文件输入的HTML表单,复制了它发送的原始multipart / form-data请求,并尝试将该数据作为带有curl的文件发送到PUT请求中。这样的工作,但我必须手动解析服务器上的原始数据,我不确定这是最好的主意。或者,我想我可以将文件作为PUT请求的主体发送,并将URL中的其他参数作为查询字符串添加 - 但我想这种方式违背了PUT REST资源的要点..

请分享您对此的看法。 谢谢!

1 个答案:

答案 0 :(得分:2)

除非你的原始版本不够用,否则至少还有其他两种方法(因为libcurl也应该使用该脚本处理二进制文件)。请注意,您决定如何在接收端接收PUT不是卷曲问题,因此我将其排除在此响应之外。

1 - 就像你刚开始时一样,但提供了一个CURLOPT_READFUNCTION,用它将数据提供给它将发送的libcurl。

2 - 使用CURLOPT_POSTFIELDS(带字符串)并使其看起来像POST,然后使用CURLOPT_CUSTOMREQUEST将HTTP方法更改为“PUT”