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

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

额外注意事项

  1. 可以给Flask应用添加文件大小限制,防止超大文件上传:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制最大上传16MB
  1. 检查UPLOAD_FOLDER的权限,确保应用有写入该目录的权限。

你原来的curl命令是完全正确的,修改代码后再用这个命令测试,应该就能正常获取文件并完成上传了。

内容的提问来源于stack exchange,提问作者Joseph Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:24