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

How to upload file with Guzzle client?

我正在尝试对上传方法进行 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 Fatal error: Call to undefined method GuzzleHttp\Stream\Stream::addFile()

错误是什么? 谢谢!

我不知道 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."

好的,我终于找到了答案。希望对某人有所帮助。

上传文件,正确的方式是:

$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请求的第四个参数,但你必须将所有字段作为正文原始数据传递。