如何使用 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请求的第四个参数,但你必须将所有字段作为正文原始数据传递。
我正在尝试对上传方法进行 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请求的第四个参数,但你必须将所有字段作为正文原始数据传递。