无法使用Guzzle发布以'@'开头的内容

时间:2015-05-13 04:41:04

标签: php twitter guzzle

我使用Guzzle在Twitter上发布数据,一旦我尝试回复任何推文并在回复内容中设置原始推文用户处理程序。然后最终内容看起来像

$input = array('status' => '@abhishekm2040 Hi with screenname again.', 
           'in_reply_to_status_id' => '2345454545'); 

然后我收到状态内容的错误消息

 "message": "Unable to open abhishekm2040 Hi with screenname again. for reading",

因为以下代码:

__的src /第三方/狂饮/ HTTP /消息/ RequestFactory.php

if (is_array($body) || $body instanceof Collection) {
                // Normalize PHP style cURL uploads with a leading '@' symbol
                foreach ($body as $key => $value) {
                    if (is_string($value) && substr($value, 0, 1) == '@') {
                        $request->addPostFile($key, $value);
                        unset($body[$key]);
                    }
                }
                // Add the fields if they are still present and not all files
                $request->addPostFields($body);
            }

请告诉我如何解决这个问题。

https://github.com/guzzle/guzzle3/issues/57

2 个答案:

答案 0 :(得分:1)

让我们首先了解为什么

Guzzle使用cURL,因此我查看了php cURL手册,根据它,这里是CURLOPT_POSTFIELDS选项的定义(对数据“负责”):

  

要在HTTP“POST”操作中发布的完整数据。要发布文件,   使用@预先添加文件名并使用完整路径。文件类型可以是   通过跟随文件名中的类型明确指定   format'; type = mimetype'。此参数可以作为a传递   urlencoded字符串,如'para1 = val1& para2 = val2& ...'或作为数组   字段名称为键,字段数据为值。如果value是一个数组,   Content-Type标头将设置为multipart / form-data。截至PHP   5.2.0,如果使用@前缀将文件传递给此选项,则value必须是数组。从PHP 5.5.0开始,不推荐使用@前缀和文件   可以使用CURLFile发送。可以禁用@前缀以确保安全   通过设置CURLOPT_SAFE_UPLOAD传递以@开头的值   选项为TRUE。

所以你提到的行为是理性和合乎逻辑的。 请注意上述说明中的最后两行:

  

从PHP 5.5.0开始,不推荐使用@前缀和文件   可以使用CURLFile发送。可以禁用@前缀以安全传递>通过将CURLOPT_SAFE_UPLOAD选项设置为TRUE,以@开头的值。

解决方案是将CURLOP_SAFE_UPLOAD选项设置为TRUE,但由于您使用的是框架,因此需要一些工作。类似的东西:

//你的新输入数组

$input = array('status' => '@abhishekm2040 Hi with screenname again.', 
           'in_reply_to_status_id' => '2345454545',
           'ignore_a' => true);

在框架的代码中:

            if(isset($body['ignore_a']) && $body['ignore_a']){
               $ignore_a = true;
               //Here you should set the curlop_safe_upload option to true.
               //Since i'm not familiar with that framework I don't know
               //how to do it.
               //Update: It seems that the framework doesn't has a `setCurlOpt` function so you'll just have to write one.
            } else {
               $ignore_a = false;
            }

            foreach ($body as $key => $value) {
                if (!$ignore_a && is_string($value) && substr($value, 0, 1) == '@') {
                    $request->addPostFile($key, $value);
                    unset($body[$key]);
                }
            }

(请注意我没有'测试过此代码,而且只是为了显示一般的想法而写的)

如果考虑最后两行的第一部分:不推荐使用@prefix和PHP 5.5.0。这意味着可能在该框架的较新版本中 - 它不会发生在你身上。

我在你的GitHub线程上添加了这个答案的链接。请注意,由于该框架已经有更新的版本,开发人员可能无法使用它,只会让您获得更新的版本。

答案 1 :(得分:0)

一旦我更新了最新的Guzzle库,我的问题就解决了。

感谢Ofir Baruch的指示