在 codeception 中将文件发送到 Restful 服务
Send file to Restful service in codeception
我想测试 restful API 文件上传测试。
我尝试 运行:
$I->sendPOST($this->endpoint, $postData, ['file' => 'example.jpg']);
我希望它的行为与用户在名称为 file
的文件输入中发送的 example.jpg
文件相同,但它似乎无法以这种方式工作。我得到:
[PHPUnit_Framework_ExceptionWrapper] An uploaded file must be an array or an instance of UploadedFile.
是否可以在代码接收中使用 REST 插件上传文件?文档非常有限,很难说如何去做。
我也在测试 API 使用 Postman
插件到 Google Chrome
,我可以使用这个插件毫无问题地上传文件。
经过测试似乎可以正常工作,我们需要使用 UploadedFile
对象作为文件。
例如:
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$mime = 'image/jpeg';
$uploadedFile = new \Symfony\Component\HttpFoundation\File\UploadedFile($path . $filename, $filename, $mime,
filesize($path . $filename));
$I->sendPOST($this->endpoint, $postData, ['file' => $uploadedFile]);
我最近一直在努力解决同样的问题,发现有另一种方法可以在不使用 Symfony 的 UploadedFile class 的情况下解决问题。您只需要以与 $_FILES 数组相同的格式传递包含文件数据的数组。例如,这段代码对我来说效果很好:
$I->sendPOST(
'/my-awesome-api',
[
'sample-field' => 'sample-value',
],
[
'myFile' => [
'name' => 'myFile.jpg',
'type' => 'image/jpeg',
'error' => UPLOAD_ERR_OK,
'size' => filesize(codecept_data_dir('myFile.jpg')),
'tmp_name' => codecept_data_dir('myFile.jpg'),
]
]
);
希望这对某人有所帮助并防止检查框架的源代码(我被迫这样做,因为文档跳过了如此重要的细节)
['file' => 'example.jpg']
格式也可以,但该值必须是现有文件的正确路径。
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$I->sendPOST($this->endpoint, $postData, ['file' => $path . $filename]);
下面为我自己工作,
在服务器上:
$uploadedResume= $_FILES['resume_uploader'];
$outPut = [];
if (isset($uploadedResume) && empty($uploadedResume['error'])) {
$uploadDirectory = 'uploads/users/' . $userId . '/documents/';
if (!is_dir($uploadDirectory)) {
@mkdir($uploadDirectory, 0777, true);
}
$ext = explode('.', basename($uploadedResume['name']));
$targetPath = $uploadDirectory . md5(uniqid()) . '.' . end($ext);
if (move_uploaded_file($uploadedResume['tmp_name'], $targetPath)) {
$outPut[] = ['success' => 'success', 'uploaded_path' => $targetPath];
}
}
return json_encode($output);
抱歉,描述代码太长了:P
在测试方面:
//resume.pdf is copied in to tests/_data directory
$I->sendPOST('/student/resume', [], ['resume_uploader' => codecept_data_dir('resume.pdf') ]);
@Yaronius 的回答在我从测试中删除以下 header 后对我有用:
$I->haveHttpHeader('Content-Type', 'multipart/form-data');
我想测试 restful API 文件上传测试。
我尝试 运行:
$I->sendPOST($this->endpoint, $postData, ['file' => 'example.jpg']);
我希望它的行为与用户在名称为 file
的文件输入中发送的 example.jpg
文件相同,但它似乎无法以这种方式工作。我得到:
[PHPUnit_Framework_ExceptionWrapper] An uploaded file must be an array or an instance of UploadedFile.
是否可以在代码接收中使用 REST 插件上传文件?文档非常有限,很难说如何去做。
我也在测试 API 使用 Postman
插件到 Google Chrome
,我可以使用这个插件毫无问题地上传文件。
经过测试似乎可以正常工作,我们需要使用 UploadedFile
对象作为文件。
例如:
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$mime = 'image/jpeg';
$uploadedFile = new \Symfony\Component\HttpFoundation\File\UploadedFile($path . $filename, $filename, $mime,
filesize($path . $filename));
$I->sendPOST($this->endpoint, $postData, ['file' => $uploadedFile]);
我最近一直在努力解决同样的问题,发现有另一种方法可以在不使用 Symfony 的 UploadedFile class 的情况下解决问题。您只需要以与 $_FILES 数组相同的格式传递包含文件数据的数组。例如,这段代码对我来说效果很好:
$I->sendPOST(
'/my-awesome-api',
[
'sample-field' => 'sample-value',
],
[
'myFile' => [
'name' => 'myFile.jpg',
'type' => 'image/jpeg',
'error' => UPLOAD_ERR_OK,
'size' => filesize(codecept_data_dir('myFile.jpg')),
'tmp_name' => codecept_data_dir('myFile.jpg'),
]
]
);
希望这对某人有所帮助并防止检查框架的源代码(我被迫这样做,因为文档跳过了如此重要的细节)
['file' => 'example.jpg']
格式也可以,但该值必须是现有文件的正确路径。
$path = codecept_data_dir();
$filename = 'example-image.jpg';
// copy original test file to have at the same place after test
copy($path . 'example.jpg', $path . $filename);
$I->sendPOST($this->endpoint, $postData, ['file' => $path . $filename]);
下面为我自己工作,
在服务器上:
$uploadedResume= $_FILES['resume_uploader'];
$outPut = [];
if (isset($uploadedResume) && empty($uploadedResume['error'])) {
$uploadDirectory = 'uploads/users/' . $userId . '/documents/';
if (!is_dir($uploadDirectory)) {
@mkdir($uploadDirectory, 0777, true);
}
$ext = explode('.', basename($uploadedResume['name']));
$targetPath = $uploadDirectory . md5(uniqid()) . '.' . end($ext);
if (move_uploaded_file($uploadedResume['tmp_name'], $targetPath)) {
$outPut[] = ['success' => 'success', 'uploaded_path' => $targetPath];
}
}
return json_encode($output);
抱歉,描述代码太长了:P
在测试方面:
//resume.pdf is copied in to tests/_data directory
$I->sendPOST('/student/resume', [], ['resume_uploader' => codecept_data_dir('resume.pdf') ]);
@Yaronius 的回答在我从测试中删除以下 header 后对我有用:
$I->haveHttpHeader('Content-Type', 'multipart/form-data');