用Flask框架实现的单张图片上传功能 支持上传后的图片预览

摘要

这篇博客详细介绍了如何使用Flask框架实现单张图片上传功能,并支持上传后的图片预览。内容包括文件上传表单的创建、服务器端文件接收与存储、图片预览的前端实现(如使用JavaScript或Flask静态文件处理),以及安全性考虑(如文件类型验证)。通过示例代码,读者可以快速掌握图片上传与预览的核心实现方法。

在这里插入图片描述

提示词

采用大模型:通义千问(代码模式)

实现一个单张图片上传的Flask项目,要求:
## UI框架
- 采用bootstrap 5.3.x版本
## 页面布局
页面分为上下两个部分,上面部分为图片上传,下面部分为图片浏览。
### 图片上传部分
- 图片选择框
- 图片上传按钮
### 图片浏览部分
- 采用格栅系统排版
- 一行显示4张图片
## 服务器端
- 在.env文件中配置图片路径的环境参数
- 图片文件存放在静态目录下的upload目录中
- 在upload目录创建files.json文件,记录所有已上传的图片,含图片文件名
## 其它
- 页面屏幕居中
- 采用响应式页面设计

输出

为了实现这个单张图片上传的Flask项目,我们需要创建几个文件和目录。以下是完整的项目结构和代码:

项目结构

flask_image_upload/
│
├── .env
├── app.py
├── static/
│   └── upload/
│       └── files.json
└── templates/
    └── index.html

创建.env文件

.env文件中配置图片路径的环境参数:

UPLOAD_FOLDER=static/upload
FILES_JSON_PATH=static/upload/files.json

创建app.py文件

这是Flask应用的主要文件,包含路由、图片上传处理逻辑等。

from flask import Flask, render_template, request, redirect, url_for
import os
import json
from dotenv import load_dotenv

load_dotenv()

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.getenv('UPLOAD_FOLDER')
app.config['FILES_JSON_PATH'] = os.getenv('FILES_JSON_PATH')

if not os.path.exists(app.config['UPLOAD_FOLDER']):
    os.makedirs(app.config['UPLOAD_FOLDER'])

if not os.path.isfile(app.config['FILES_JSON_PATH']):
    with open(app.config['FILES_JSON_PATH'], 'w') as f:
        json.dump([], f)

def save_file_info(filename):
    with open(app.config['FILES_JSON_PATH'], 'r+') as f:
        data = json.load(f)
        if filename not in data:
            data.append(filename)
            f.seek(0)
            json.dump(data, f, indent=4)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        file = request.files.get('file')
        if file and allowed_file(file.filename):
            filename = file.filename
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            save_file_info(filename)
            return redirect(url_for('index'))
    
    with open(app.config['FILES_JSON_PATH'], 'r') as f:
        images = json.load(f)
    
    return render_template('index.html', images=images)

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'png', 'jpg', 'jpeg', 'gif'}

if __name__ == '__main__':
    app.run(debug=True)

创建templates/index.html文件

这是前端页面模板,使用Bootstrap 5.3.x进行布局。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Upload</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="d-flex flex-column min-vh-100 justify-content-center align-items-center bg-light">
    <div class="container">
        <div class="row mb-4">
            <div class="col text-center">
                <h1>Upload an Image</h1>
                <form action="/" method="post" enctype="multipart/form-data">
                    <input type="file" class="form-control form-control-lg mb-2" name="file" accept=".png,.jpg,.jpeg,.gif" required>
                    <button type="submit" class="btn btn-primary btn-lg">Upload</button>
                </form>
            </div>
        </div>
        <div class="row row-cols-1 row-cols-md-4 g-4">
            {% for image in images %}
            <div class="col">
                <div class="card h-100">
                    <img src="{{ url_for('static', filename='upload/' + image) }}" class="card-img-top" alt="{{ image }}">
                    <div class="card-body">
                        <p class="card-text">{{ image }}</p>
                    </div>
                </div>
            </div>
            {% endfor %}
        </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
</body>
</html>

初始化static/upload/files.json文件

确保static/upload/files.json文件存在并且为空列表:

[]

运行项目

确保你已经安装了所需的Python包:

pip install flask python-dotenv

然后运行Flask应用:

python app.py

打开浏览器访问http://127.0.0.1:5000/即可看到图片上传和浏览功能。

AI写代码,编程零门槛!用自然语言唤醒AI的创造力!点击查看更多AI提示词编程案例!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StevenX5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值