如何使用Guzzle客户端上传文件?

时间:2015-01-09 10:12:46

标签: symfony behat mink guzzle goutte

我试图在上传方法上进行BDD测试。我在symfony2项目中使用Behat和Mink。

现在我可以通过此客户端做出简单的请求:

$this->client = $this->mink->getSession('goutte')->getDriver()->getClient();

$this->client->request("POST", $url, array('content-type' => 'application/json'), array(), array(), $fields);

没有任何问题。

如何使用文件执行请求?我试过这个:

$file = new \Symfony\Component\HttpFoundation\File\UploadedFile($path, "video");
$fields = json_encode($table->getColumnsHash()[0]);
$this->client->request("POST", $url, array('content-type' => 'multipart/form-data'), array($file), array(), $fields);

我收到的错误是:

  

PHP致命错误:调用未定义的方法   GuzzleHttp \流\流:: addFile()

错误是什么? 谢谢!

2 个答案:

答案 0 :(得分:1)

好吧我终于找到了答案。希望有所帮助。

要上传文件,正确的方法是:

$fields = $table->getColumnsHash()[0]; //array('name' => 'test', 'surname' => 'test');
$fields["file"] = fopen($path, 'rb');
$this->client->request("POST", $url, array('Content-Type => multipart/form-data'), array(), array(), $fields);

诀窍是你不能使用Goutte请求的第四个参数,但你必须将所有字段作为正文原始数据传递。

答案 1 :(得分:0)

我不知道Guzzle上传,但简单的上传工作如下。你可以删除不必要的位。

注意:我建议你将虚拟图像文件保存在项目文件夹中,因为如果有很多开发人员在同一个项目上工作,他们将拥有完全相同的文件夹结构,因此可以访问图像。我见过一些人从他们的桌面上选择一个图像,因人而异,所以测试失败了。

下面的

files_path必须指向您的项目目录,它应该以例如/var/www/html/myproject/test/build/dummy/

<强> behat.yml

default:
    context:
        class: Site\FrontendBundle\Features\Context\FeatureContext
        parameters:
            output_path: %behat.paths.base%/build/behat/output/
            screen_shot_path: %behat.paths.base%/build/behat/screenshot/
    extensions:
        Behat\Symfony2Extension\Extension:
            mink_driver: true
            kernel:
                env: test
                debug: true
        Behat\MinkExtension\Extension:
            base_url: 'http://localhost/local/symfony/web/app_test.php/'
            files_path: %behat.paths.base%/build/dummy/
            javascript_session: selenium2
            browser_name: firefox
            goutte: ~
            selenium2: ~
    paths:
        features: %behat.paths.base%/src
        bootstrap: %behat.paths.features%/Context

假设您在/var/www/html/myproject/test/build/dummy/文件夹下有 jpg.jpg ,如下所示。

上传的示例功能:

Feature: Create League
  In order to upload a file
  As a user
  I should be able to select and upload a file

  @javascript
  Scenario: I can create league
    Given I am on "/"

    When I attach the file "jpg.jpg" to "league_flag"
    And I press "Submit"
    Then I should see "Succeeded."