使用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
相关产品推荐
相关产品推荐

