直接用 request.files 获取文件对象,但不要立即读取或保存到磁盘,避免大文件导致内存溢出或请求超时。

Flask 里怎么接住上传的文件而不崩
直接用 request.files 拿文件对象,但别急着读或保存到本地磁盘——这是最常见踩坑点。Flask 默认会把小文件(file.read() 或 file.save(),整个内容就加载进内存了,上传 500MB 文件可能直接 OOM。
- 用
stream = file.stream获取流式句柄,传给云存储 SDK 的上传方法(它们基本都支持流) - 务必检查
file.filename是否为空或含路径遍历字符(如../etc/passwd),用os.path.basename()清洗 - 设置
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024限制总请求体大小,防止恶意大包打满内存
对接阿里云 OSS:用 put_object 传流不落地
OSS Python SDK 的 put_object 支持直接传 BytesIO 或原始流,跳过本地存盘环节。关键不是“怎么连”,而是“怎么避免把文件先 dump 到硬盘再读一次”。
- 安装
aliyun-python-sdk-oss2,初始化OssAuth和Bucket时注意 endpoint 区域要匹配 bucket 所在地域(比如oss-cn-hangzhou.aliyuncs.com) - 不要用
file.save('/tmp/xxx'),改用:bucket.put_object(key, file.stream, headers={'Content-Type': file.content_type}) -
file.content_type可能是空或错的,建议根据后缀映射 MIME 类型(用mimetypes.guess_type(filename)),否则图片可能被浏览器当文本下载
对接 AWS S3:用 upload_fileobj 传流,别碰 upload_file
upload_file 强制要求本地路径,必须落盘;而 upload_fileobj 接收任意类文件对象(包括 request.files['f'].stream),这才是正确姿势。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 确保 boto3 session 使用了正确的 region(S3 bucket 是区域绑定的),且 IAM 用户有
s3:PutObject权限 - 代码示例:
s3_client.upload_fileobj(file.stream, 'my-bucket', key, ExtraArgs={'ContentType': content_type}) - 如果上传后访问 403,大概率是 bucket 策略没放开 public-read,或没配 CORS(前端直传才需要,后端代理上传一般不需要)
- 注意
file.stream是单次读取流,不能重复 seek —— 如果你要同时传 OSS 和 S3,得先读进BytesIO缓存一份
上传成功后怎么返回可靠 URL
别拼接 http://bucket.oss-cn-x.region.aliyuncs.com/key 这种裸地址——OSS/S3 的公开访问策略、CDN、自定义域名都可能让这个 URL 失效或不安全。
- OSS 推荐用
sign_url生成带签名的临时 URL(尤其非公开 bucket),有效期按需设(如 30 分钟) - S3 对公开 bucket 可用
generate_presigned_url,私有 bucket 必须用它,否则返回 403 - 永远校验
file.filename后缀是否在白名单内(如['.jpg', '.pdf', '.xlsx']),防止上传 .py/.sh 绕过后续处理逻辑
流式上传看着简单,实际容易卡在权限、region 错配、MIME 类型缺失、URL 权限这几处。尤其是本地测试通了,一上生产就 403 或 404,八成是 endpoint、bucket 策略或签名方式没对齐。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










