You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:25:19