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

Flask接收JavaScript FormData上传压缩包时request.files为空问题

问题原因与解决方案

1. 变量使用错误+异步流未就绪就提前发送

你代码中通过tar.c()生成的压缩流变量为tar_archive,但在formData.append时实际传入的是script变量或其管道流,没有使用正确的压缩包流。同时tar.c()返回的是异步可读流,你没有等待流打包完成就直接发起请求,导致上传的请求体为空,Flask自然解析不到任何文件与表单字段,日志中Content-Length仅为215也可以验证传输内容为空,没有包含实际的压缩包数据。

修正方案:可以先将压缩流转为Buffer,确保内容完整后再上传,参考代码:

const tar = require('tar');
const fetch = require('node-fetch');
const FormData = require('form-data');

const chunks = [];
// 正确使用tar生成的压缩流
const tar_archive = tar.c({ gzip: true, cwd: script }, ["."]);
// 等待流读取完成,拼接为Buffer
for await (const chunk of tar_archive) {
  chunks.push(chunk);
}
const tarBuffer = Buffer.concat(chunks);

const formData = new FormData();
formData.append('file', tarBuffer, 'name.tar.gz');

const res = await fetch(`http://localhost:3131`, {
  method: "POST",
  body: formData
});

2. 低版本node-fetch对Stream类型的FormData字段支持缺陷

从请求日志可以看到你使用的是1.x版本的node-fetch,该版本对传入Stream类型的FormData字段处理存在缺陷,不会自动等待流读取完成、也不会正确计算请求长度和写入流内容到请求体。你之前的逻辑对接其他服务正常是因为不同服务对不完整的multipart/form-data请求容错能力不同,Flask的解析逻辑更严格,所以会直接解析为空。

如果你不想转Buffer,可以升级node-fetch到2.x及以上版本,直接传入压缩流即可正常工作:

// node-fetch >= 2.6.0版本支持直接传入流
const tar_archive = tar.c({ gzip: true, cwd: script }, ["."]);
const formData = new FormData();
formData.append('file', tar_archive, 'name.tar.gz');

const res = await fetch(`http://localhost:3131`, {
  method: "POST",
  body: formData
});

3. Flask侧配置校验

如果上述修改完成后仍存在问题,可以检查Flask侧配置:

  • 确保没有设置过小的MAX_CONTENT_LENGTH上传大小限制,按需调整即可:
# 示例:设置最大上传大小为100M
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024
  • 本地测试时直接访问Flask监听的3131端口,排除中间代理过滤请求体的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:42:02