如何解决Flask应用中大文件上传失败的问题
Flask大文件上传报错(308/EPIPE)解决方案
问题根源分析
- 路由尾斜杠不匹配触发308重定向:你的路由定义为
/files/upload_file/(带尾斜杠),但请求URL是/files/upload_file(不带尾斜杠),Flask会返回308永久重定向。POST请求在重定向过程中,大文件的multipart数据无法被正确重传,导致连接提前断开,出现EPIPE错误,同时文件字段丢失。 - curl命令语法错误:第一个curl命令的最后一个form参数多了一个单引号:
--form 'file_name="my-great-file.mp4"'',这会导致请求格式异常,大文件场景下更容易触发错误。 - 内存读取大文件的风险:代码中
file.read()一次性将整个文件读入内存,虽1.6MB不算极大,但后续若处理更大文件,会导致内存占用过高,也可能引发超时问题。
解决方案
1. 统一路由与请求的尾斜杠
两种方式二选一:
- 修改路由定义,去掉尾斜杠:
@blueprint.route("/files/upload_file", methods=["POST"]) # 移除末尾的/ def upload_file(): # 原有业务代码
- 或修改curl请求的URL,添加尾斜杠:
curl --location --request POST 'http://192.168.1.217:5000/api/fileservice/0.1/files/upload_file/' \ --form 'mime_type="video/mp4"' \ --form 'uuid="12345"' \ --form 'file=@"/home/sean/Videos/long.mp4"' \ --form 'file_name="my-great-file.mp4"'
2. 修正curl命令的语法错误
删除最后一个form参数末尾多余的单引号,确保命令格式正确:
curl --location --request POST 'http://192.168.1.217:5000/api/fileservice/0.1/files/upload_file' \ --form 'mime_type="video/mp4"' \ --form 'uuid="12345"' \ --form 'file=@"/home/sean/Videos/long.mp4"' \ --form 'file_name="my-great-file.mp4"'
3. 配置Flask的文件大小限制
显式配置最大上传文件大小,避免默认限制或后续扩展问题:
# 在Flask应用初始化时添加 app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024 # 设置为64MB,可按需调整
4. 优化文件读取方式(避免内存过载)
将一次性读取整个文件改为分块处理或先保存到磁盘,示例:
@blueprint.route("/files/upload_file", methods=["POST"]) def upload_file(): print("test") form_data = flask.request.form file = flask.request.files.get("file") # 使用get避免KeyError if not file: raise Exception("No file provided") # 方式1:先保存到磁盘再读取 save_path = f"/tmp/{form_data['file_name']}" file.save(save_path) with open(save_path, 'rb') as f: byte_stream = f.read() # 方式2:分块读取(适合超大文件) # byte_stream = b'' # chunk_size = 4096 # while chunk := file.read(chunk_size): # byte_stream += chunk request = FileCreateRequest( uuid=form_data["uuid"], file_name=form_data["file_name"], mime_type=form_data["mime_type"], bytes=byte_stream, ) # 原有后续响应代码...
验证步骤
- 先修正curl命令的语法错误和URL尾斜杠问题,测试上传1.6MB文件。
- 若仍有问题,检查Flask的
MAX_CONTENT_LENGTH配置是否生效。 - 最后优化文件读取逻辑,避免内存占用过高。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

