NestJS通过Axios向Symfony 5.4.31 API传文件时提示文件为空
对接Symfony 5.4.31 API时Axios上传文件被判定为空的问题
我用NestJS编写代码,通过Axios向基于Symfony 5.4.31开发的外部API上传本地文件时,API始终判定文件为空,抛出"file" is required错误。
测试代码(NestJS + Axios)
import * as FormData from 'form-data'; const stream = fs.createReadStream(filePath); const form = new FormData(); form.append('file', stream, 'file.pdf'); axios({ method: 'post', url: url, data: form, headers: { "Authorization": "Bearer "+token, ...form.getHeaders() } }) .then(function (response) { console.log(response.data); }) .catch(function (response) { console.log(response); });
API文件校验逻辑
API通过以下代码校验文件是否存在:
) : DocumentFileApiDto { $uploadedFile = $request->files->get('file'); if($uploadedFile === null) { throw new BadRequestHttpException('"file" is required'); }
收到的错误响应
data: { '@context': '/api/public/contexts/Error', '@type': 'hydra:Error', 'hydra:title': 'An error occurred', 'hydra:description': '"file" is required', trace: [Array] }
排查过程
- 将请求发送至httpbin.org/post测试,一切正常,文件能被正确接收。
- 在自己的旧版Symfony项目中添加测试路由,代码如下:
public function testUploadAction(Request $request) { $jsonConverter = new JsonConverter(); print_r($request->files->get('file')); print_r($_FILES); print_r($_POST); $response = $jsonConverter->objectToJson([]); return $response; }
测试路由返回的响应显示文件可正常接收:
Symfony\Component\HttpFoundation\File\UploadedFile Object ( [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => test.pdf [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => application/pdf [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 138806 [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0 [pathName:SplFileInfo:private] => /tmp/php6bG6bm [fileName:SplFileInfo:private] => php6bG6bm ) Array ( [file] => Array ( [name] => test.pdf [type] => application/pdf [tmp_name] => /tmp/php6bG6bm [error] => 0 [size] => 138806 ) )
- 使用AdvancedRestClient工具测试时,文件可成功上传至目标API,说明API本身逻辑无问题。
尝试的解决方案及新问题
推测API的某个中间件因请求缺少Content-Length头移除了文件,但由于发送的是流,无法直接添加该头。尝试通过fs.statSync(filePath)['size']手动添加文件大小后,API可检测到文件,但又出现新错误:
The uploaded file was only partially uploaded.
且该错误在自己的Symfony测试项目中也会出现,看起来是流上传时手动设置Content-Length导致的典型问题。
内容的提问来源于stack exchange,提问作者Mayous
相关产品推荐
相关产品推荐

