Flask-Restplus上传文件报错:'NoneType'对象无'filename'属性
解决Flask-Restful上传文件时的AttributeError问题
你遇到的AttributeError: 'NoneType' object has no attribute 'filename'错误,核心原因是请求解析器没有正确从HTTP请求中获取到上传的文件,导致image_file和audio_file都变成了None,调用.filename自然会报错。
问题根源
你在parser.add_argument里给文件参数指定的location=UPLOAD_FOLDER完全错了!location参数的作用是告诉解析器从HTTP请求的哪个部分取数据,上传的文件是存在请求的files字段里的,而不是直接指定本地文件夹路径。
修改方案
我帮你调整了代码,主要改这几个关键地方:
- 把文件参数的
location改成'files',这是Flask-Restful解析上传文件的正确位置 - 加上
required=True,强制要求客户端必须上传这两个文件,避免出现None的情况 - 保存文件时拼接完整的上传路径,防止文件被存在当前运行目录而非你指定的
UPLOAD_FOLDER
修改后的代码如下:
from flask_restful import Resource, reqparse import werkzeug from your_module import connect, MONGODB_DB, MONGODB_HOST, MONGODB_PORT, Figure, get_file_size import os # 确保上传目录存在 UPLOAD_FOLDER = '/path/to/your/upload/folder' if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) class FiguresResource(Resource): parser = reqparse.RequestParser() parser.add_argument('thing', type=str, required=True) # 修正location为'files',添加required确保参数必传 parser.add_argument( 'image_file', type=werkzeug.datastructures.FileStorage, location='files', required=True ) parser.add_argument( 'audio_file', type=werkzeug.datastructures.FileStorage, location='files', required=True ) def post(self): db = connect(MONGODB_DB, host=MONGODB_HOST, port=MONGODB_PORT) data = self.parser.parse_args() image = data['image_file'] audio = data['audio_file'] # 拼接完整的保存路径 image_save_path = os.path.join(UPLOAD_FOLDER, image.filename) audio_save_path = os.path.join(UPLOAD_FOLDER, audio.filename) fig = Figure( data['thing'], image.filename, get_file_size(image), audio.filename, get_file_size(audio) ) image.save(image_save_path) audio.save(audio_save_path) fig.save() db.close() return {"message": "Files uploaded successfully"}, 201
额外注意事项
- 可以给Flask应用添加文件大小限制,防止超大文件上传:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 限制最大上传16MB
- 检查
UPLOAD_FOLDER的权限,确保应用有写入该目录的权限。
你原来的curl命令是完全正确的,修改代码后再用这个命令测试,应该就能正常获取文件并完成上传了。
内容的提问来源于stack exchange,提问作者Joseph Vargas
相关产品推荐
相关产品推荐

