我正在尝试使用PUT将文件上传到我的Slim Framework服务器。我已经成功创建了一个POST路由,可以毫无问题地检索上载的文件,但是如果我将相同的请求发送到相同的路由,唯一的不同是方法,那么我将从POST收到一个文件,而从PUT收到一个空文件。
这是我的路由器:
$app->put('/users/{id}', 'RideTimeServer\API\Controllers\UserController:update');
$app->post('/users/{id}', 'RideTimeServer\API\Controllers\UserController:update'); // DEBUG:
然后将请求通过控制器传递给processPicture
方法:
protected function processPicture(Request $request): string
{
// First look for an uploaded picture
if (!empty($request->getUploadedFiles()['picture'])) {
// http://www.slimframework.com/docs/v3/cookbook/uploading-files.html
$uploadedFile = $request->getUploadedFiles()['picture'];
/**
* { file, name, type }
*/
var_dump($uploadedFile);
// Then check URL
} elseif (!empty($request->getParsedBody()['picture'])) {
$url = $request->getParsedBody()['picture'];
if (!filter_var($url, FILTER_VALIDATE_URL)) {
throw new UserException('Invalid picture URL', 400);
}
var_dump($url);
} else {
// $this->container['logger']->addInfo('Submitted user with no picture');
var_dump('Submitted user with no picture');
var_dump($request->getUploadedFiles());
var_dump($request->getParsedBody());
}
return '';
}
现在,如果我发送
curl -X PUT \
http://localhost/ridetime/api/users/1 \
-H 'Authorization: Bearer t0k3n' \
-H 'cache-control: no-cache' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F 'picture=@/home/asdf/Tmp/Screenshot_20190125_005049.png'
我从Submitted user with no picture
收到[]
,null
和var_dump
,但是如果我将请求更改为POST:
curl -X POST \
http://localhost/ridetime/api/users/1 \
-H 'Authorization: Bearer t0k3n' \
-H 'cache-control: no-cache' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F 'picture=@/home/asdf/Tmp/Screenshot_20190125_005049.png'
我获得了上传文件的详细信息。
我尝试将-F 'picture=@...png
替换为--upload-file ./file.png
,结果是相同的。