1、简述
在 Python 开发中,Flask 是一个轻量级的 Web 框架,适合构建简单的 Web 应用和 RESTful API。当涉及图片上传时,通常我们需要将图片存储到云端,而不是直接保存在服务器本地。七牛云作为一款成熟的云存储服务,提供了丰富的 API 来帮助我们实现这一需求。
本文将介绍如何使用 Flask 实现图片上传,并将图片保存到七牛云空间中,最后展示详细的 Python 代码样例。
2、准备工作
2.1 安装必要的依赖
首先,你需要安装 Flask 以及七牛云的 Python SDK。可以通过 pip 来安装:
pip install Flask qiniu
2.2 注册七牛云账号并获取密钥
要使用七牛云的存储服务,首先需要在 七牛云官网 注册一个账号并创建一个存储空间。创建成功后,你将得到以下关键信息:
- Access Key (AK)
- Secret Key (SK)
- 存储空间名 (Bucket Name)
- 外链域名 (用于访问存储的文件)
备注:请实名认证获取免费的10G网盘空间
3、文件上传功能
我们首先编写一个 Flask 应用,允许用户通过表单上传图片。
3.1 处理文件上传
在 Flask 中,我们可以使用 request.files 来获取上传的文件。下面是一个基本的文件上传示例:
from flask import Flask, request, redirect, url_for, render_template
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
# 允许上传的文件类型
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
# 上传文件的路径
UPLOAD_FOLDER = 'uploads/'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 检查文件类型
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
# 检查请求中是否包含文件
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('upload_file', filename=filename))
return render_template('upload.html')
if __name__ == '__main__':
app.run(debug=True)
3.2 创建上传页面 upload.html
在 templates 文件夹下创建一个简单的 HTML 表单页面,用于上传图片:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload File</title>
</head>
<body>
<h1>Upload Image</h1>
<form action="/" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
此时,Flask 应用已经可以处理本地文件的上传。接下来,我们将实现将文件上传到七牛云空间的功能。
4、上传图片到七牛云
4.1 七牛云 SDK 配置
首先,在代码中引入七牛云 Python SDK,并配置 Access Key 和 Secret Key。
import qiniu
# 七牛云配置信息
ACCESS_KEY = '你的AccessKey'
SECRET_KEY = '你的SecretKey'
BUCKET_NAME = '你的BucketName'
QINIU_DOMAIN = '你的外链域名' # 例如:http://your-domain.qiniudn.com/
# 获取上传凭证
def get_qiniu_token():
q = qiniu.Auth(ACCESS_KEY, SECRET_KEY)
token = q.upload_token(BUCKET_NAME)
return token
# 上传文件到七牛云
def upload_to_qiniu(file_path, file_name):
token = get_qiniu_token()
ret, info = qiniu.put_file(token, file_name, file_path)
if ret:
return QINIU_DOMAIN + '/' + file_name
else:
raise Exception('Upload to Qiniu failed.')
4.2 集成七牛云到 Flask 上传功能
接下来,我们将上传的图片保存到七牛云。修改 upload_file 函数,将文件保存到本地后,再上传到七牛云空间。
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
# 上传文件到七牛云
try:
qiniu_url = upload_to_qiniu(file_path, filename)
return f'File uploaded successfully! Qiniu URL: {qiniu_url}'
except Exception as e:
return f'Upload to Qiniu failed: {str(e)}'
return render_template('upload.html')
在用户上传图片时,程序会首先将文件保存在本地,然后使用七牛云 SDK 将文件上传到云端,返回上传后的文件 URL。
5、总结
本文介绍了如何使用 Flask 实现图片上传,并将文件上传到七牛云存储空间。通过七牛云的 Python SDK,我们可以轻松地将文件存储在云端,并获得对应的访问 URL。在实际应用中,这种方法适用于构建图片上传功能的项目,如电商平台、社交媒体等。
评论区