Flask中request.files返回空ImmutableMultiDict([])的问题排查
Flask AJAX上传文件时request.files为空的问题解决
你的代码里有几个关键错误导致Flask无法解析上传的文件,以下是修正方案:
1. FormData添加文件的方式错误
你当前是把整个file input元素添加到FormData里,而不是选中的文件对象。需要修改为获取input的files[0]属性:
// 原代码 // form_data.append("file", $("#edit_form #image_field")[0]); // 修正后 form_data.append("file", $("#edit_form #image_field")[0].files[0]);
2. jQuery AJAX的参数配置错误
jQuery处理FormData上传时,必须禁用默认的数据处理和内容类型设置:
processData: false:阻止jQuery把FormData转换成字符串,破坏文件上传格式contentType: false:让浏览器自动生成正确的multipart/form-data请求头(包含必要的boundary),手动设置multipart/form-data会丢失boundary,导致Flask无法解析
修正后的AJAX代码:
$.ajax({ type: 'POST', url: '/api/add_product_image', data: form_data, contentType: false, processData: false, success: function(data) { console.log('Success!'); // put up image in preview }, });
3. Python代码的健壮性优化
建议增加文件存在判断,避免空文件报错,同时用更安全的路径拼接方式:
import os @app.route('/api/add_product_image', methods=['POST']) def add_product_image(): print(request.form) try: id = request.form["id"] print(request.files) file = request.files.get("file") # 检查文件是否存在且有文件名 if file and file.filename: # 使用os.path.join拼接路径,避免跨平台问题 save_path = os.path.join("./static/imgs", f"{id}.png") file.save(save_path) return {"status": "success"} else: return {"status": "error", "message": "未选择有效文件"} except Exception as e: print(e) return {"status": "error", "message": str(e)}
内容的提问来源于stack exchange,提问作者user21776820
相关产品推荐
相关产品推荐

