Python3 CGI出现'NoneType'无read属性错误,疑为3.9/3.10版本bug?
解决CGI文件上传时
AttributeError: 'NoneType' object has no attribute 'read'问题 你遇到的错误不是Python 3.9/3.10的bug,核心原因是HTML表单缺少文件上传必需的编码声明。当表单包含文件上传控件时,必须指定enctype="multipart/form-data",否则服务器端的cgi.FieldStorage无法正确识别文件上传请求,只会把文件名作为普通文本字段处理,导致fileitem.file属性为None,调用read()自然触发错误。
修复步骤
- 修改
test.html,给<form>标签添加enctype="multipart/form-data"属性:
<html><body> <form name="Form" method="POST" action="/cgi-bin/test.cgi" enctype="multipart/form-data"> <input type="file" id="file_f" name="data"><br> <input id="button" type="submit" value="SUBMIT" name="button"> </form> </body></html>
- (可选)优化CGI代码,增加异常判断避免无文件上传时的报错:
#!/usr/bin/python3 import cgi, cgitb cgitb.enable(display=1) print('Content-Type: text/html; charset=UTF-8\n') html_body = """ <!DOCTYPE html><html><body>{}<br></body></html> """ form = cgi.FieldStorage() if 'data' in form: fileitem = form['data'] # 确认是否为有效上传文件 if fileitem.filename: fbuf = fileitem.file.read() print(html_body.format(f"文件内容:{fbuf.decode('utf-8')}")) else: print(html_body.format("未选择文件")) else: print(html_body.format("未找到文件字段"))
现象解释
你提到的几个现象完全符合这个原因:
form.getvalue('data')能获取输入框文本:没有指定正确的enctype时,浏览器会把文件名作为普通表单值发送,因此能拿到文件名字符串fileitem.file为None:FieldStorage未解析出文件对象,所以该属性为空- 3.9和3.10版本均出现错误:这是HTTP表单规范问题,和Python版本无关,换3.11也会出现同样问题
内容的提问来源于stack exchange,提问作者bullTerrierMotives
相关产品推荐
相关产品推荐

