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

使用Bottle框架实现图片上传时出现500错误(AttributeError)求助

解决文件上传时的AttributeError与500内部服务器错误

你遇到的这个500错误,大概率是因为没有处理用户未选择文件就提交表单的场景。当用户直接点击Submit但没选任何文件时,request.files.get('newfile')会返回None,这时候你再去调用newfile.filename,自然会触发AttributeError——毕竟None对象根本没有filename这个属性。

下面是具体的修复和优化方案:

第一步:添加文件存在性校验

先给你的控制器代码加上判断,确保只有当用户确实选择了文件时,才执行保存逻辑:

@app.post('/upload')
def upload():
    newfile = request.files.get('newfile')
    # 检查是否存在上传文件,同时避免浏览器提交空文件名的情况
    if not newfile or newfile.filename == '':
        return "请先选择要上传的文件", 400
        
    save_path = os.path.join(config.UPLOAD_DIRECTORY, newfile.filename)
    newfile.save(save_path)
    return redirect('/')

第二步:确保上传目录存在

如果config.UPLOAD_DIRECTORY对应的文件夹还没创建,保存文件时也会报错。可以在保存前添加一段代码,自动创建目录(如果不存在的话):

import os

# 在保存文件前执行这段代码
os.makedirs(config.UPLOAD_DIRECTORY, exist_ok=True)

额外优化建议(可选但实用)

1. 避免文件名重复覆盖

如果多个用户上传同名文件,会覆盖之前的文件。可以给文件名加上时间戳或者随机字符串来区分:

from datetime import datetime

# 拆分文件名和扩展名
name, ext = os.path.splitext(newfile.filename)
# 用当前时间戳生成唯一文件名
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
new_filename = f"{name}_{timestamp}{ext}"
save_path = os.path.join(config.UPLOAD_DIRECTORY, new_filename)

2. 限制文件类型和大小

为了安全性,最好只允许上传指定类型的文件(比如图片),同时限制文件大小:

# 定义允许的文件扩展名
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 在控制器中添加类型校验
if not allowed_file(newfile.filename):
    return "仅支持上传图片文件(png/jpg/jpeg/gif)", 400

# 限制文件大小为10MB(可以根据需求调整)
app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024

现在你可以测试两种场景:选文件提交应该能正常跳转;直接点Submit不选文件,会收到清晰的400错误提示,再也不会出现500服务器错误啦。

内容的提问来源于stack exchange,提问作者M Prabodha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:59