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

Cypress发送multipart POST请求传PDF时FormData为空如何解决

问题原因及修复方案

遗漏的核心配置&错误点

  • 配置缺失1:未关闭cy.request默认的请求体序列化规则

Cypress 9.x版本的cy.request默认会自动序列化非字符串类型的请求体,同时会自动覆盖Content-Type请求头。如果直接传入FormData对象,默认序列化逻辑会将其转换为空对象,就是你看到的Body: {}的根本原因。
修复需要在cy.request的参数中新增两个配置:

  • processData: false:关闭默认的请求体序列化逻辑,保留FormData原始格式
  • contentType: false:禁止Cypress自动设置Content-Type头,让浏览器自动为FormData请求添加带boundary分隔符的正确头,手动设置multipart/form-data会缺少boundary导致后端无法解析参数
  • 配置缺失2:fixture读取的二进制文件未转换为Blob格式

你用binary格式读取的fixture返回的是二进制字符串,直接放到FormData的file字段无法被后端的MultipartFile正确识别,需要先转换为Blob对象,同时建议传入PDF文件名避免后端文件校验失败。

  • 错误配置:请求头字段无效

你写的accepts是不符合HTTP规范的头字段,标准头为Accept,这个头对multipart请求不是必填项,可以直接删除。

另外你调试时认为FormData为空是调试方式的问题,浏览器默认不会直接展示FormData的内部字段,可以用console.log([...data.entries()])打印所有键值对确认赋值成功。

修正后的完整代码

it('test', () => {
    cy.fixture(pdfFilePath, "binary").then(fileContent => {
        // 转换二进制字符串为PDF格式的Blob
        const pdfBlob = Cypress.Blob.binaryStringToBlob(fileContent, 'application/pdf');
        const data = new FormData();
        // 第三个参数传PDF文件名,避免后端MultipartFile识别异常
        data.append('file', pdfBlob, 'test.pdf');
        data.append('document-types', 'New Type');
        
        cy.request({
            method: "POST",
            url: '/api/v4/documents',
            headers: {
                authorization: authString
            },
            body: data,
            // 新增两个核心配置
            processData: false,
            contentType: false
        }).then((response) => {
            expect(response.status).to.eq(200)
        });
    });
});

内容的提问来源于stack exchange,提问作者JeyKey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:36:03