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

Flask+HTML/CSS/JS开发的webapp添加可选示例图片功能实现咨询

功能实现方案

整体逻辑

你不需要修改原有模型预测的核心逻辑,只需要把预设示例图存到服务端静态目录,前端加示例图选择交互,提交时后端判断用户是自主上传还是选了示例图,对应读取图片资源即可,和原有上传流程完全兼容。


步骤1:准备示例图片资源

  • 在Flask项目根目录下创建static/sample_images文件夹,把你要提供的示例图片全部放入该目录,文件名避免使用中文和特殊字符,比如cat_sample.jpg、car_sample.png
  • 确保示例图片格式和你模型支持的输入格式完全一致

步骤2:前端代码修改

HTML部分

<!-- 原有预测表单 -->
<form id="predict-form" enctype="multipart/form-data" method="POST" action="/predict">
  <!-- 原有文件上传控件,加id方便JS操作,保持原有逻辑不变 -->
  <input type="file" id="user-upload" name="image" accept="image/*" style="display:none">
  <button type="button" id="upload-btn">Upload Picture</button>

  <!-- 新增示例图片选择区域 -->
  <div class="sample-area">
    <p>也可以直接选择示例图片:</p>
    <div class="sample-grid">
      <!-- 每个示例图绑定data-filename属性存储自身文件名,点击后加active选中标记 -->
      <img src="/static/sample_images/sample1.jpg" alt="示例图1" class="sample-img" data-filename="sample1.jpg">
      <img src="/static/sample_images/sample2.jpg" alt="示例图2" class="sample-img" data-filename="sample2.jpg">
      <img src="/static/sample_images/sample3.jpg" alt="示例图3" class="sample-img" data-filename="sample3.jpg">
    </div>
    <!-- 隐藏input存储选中的示例图文件名,提交时传给后端 -->
    <input type="hidden" id="selected-sample" name="selected_sample">
  </div>

  <button type="submit" id="submit-btn">Submit</button>
</form>

CSS部分(可选,做选中状态区分)

.sample-grid {
  display: grid;
  grid-template-columns: repeat(3, 100px);
  gap: 12px;
  margin: 16px 0;
}
.sample-img {
  width: 100px;
  height: 100px;
  object-fit: cover;
  border: 2px solid #e5e7eb;
  border-radius: 4px;
  cursor: pointer;
}
.sample-img.active {
  border-color: #2563eb; /* 选中后显示蓝色边框 */
}

JS交互逻辑

const sampleImgs = document.querySelectorAll('.sample-img');
const selectedSampleInput = document.getElementById('selected-sample');
const userUploadInput = document.getElementById('user-upload');
const uploadBtn = document.getElementById('upload-btn');

// 示例图点击选择逻辑
sampleImgs.forEach(img => {
  img.addEventListener('click', () => {
    // 清空其他示例图的选中状态
    sampleImgs.forEach(i => i.classList.remove('active'));
    // 标记当前选中的示例图
    img.classList.add('active');
    // 存储选中的文件名到隐藏控件
    selectedSampleInput.value = img.dataset.filename;
    // 清空用户之前手动上传的文件,避免两种选择冲突
    userUploadInput.value = '';
  })
})

// 原有上传按钮逻辑保持不变,额外加清空示例图选中的逻辑
uploadBtn.addEventListener('click', () => {
  userUploadInput.click();
})
userUploadInput.addEventListener('change', () => {
  if (userUploadInput.value) {
    // 用户手动上传时清空示例图选择
    sampleImgs.forEach(i => i.classList.remove('active'));
    selectedSampleInput.value = '';
  }
})

步骤3:Flask后端适配

你只需要在原有预测接口前加一层判断,读取对应图片即可,后续模型预测逻辑完全不用修改:

from flask import Flask, request, render_template
import os
from PIL import Image # 你原有处理图片的依赖,不用更换

app = Flask(__name__)
# 配置示例图片存储路径
SAMPLE_IMG_DIR = os.path.join(app.static_folder, 'sample_images')

@app.route('/predict', methods=['POST'])
def predict():
    # 优先判断用户是否自主上传了图片
    upload_file = request.files.get('image')
    # 再判断用户是否选择了示例图
    selected_sample = request.form.get('selected_sample')
    img = None

    if upload_file and upload_file.filename != '':
        # 走原有用户上传图片的处理逻辑
        img = Image.open(upload_file.stream)
    elif selected_sample:
        # 走示例图读取逻辑
        sample_path = os.path.join(SAMPLE_IMG_DIR, selected_sample)
        # *必须加路径校验,避免恶意用户构造路径读取服务端其他文件*
        if not os.path.exists(sample_path) or not os.path.normpath(sample_path).startswith(os.path.normpath(SAMPLE_IMG_DIR)):
            return "无效的示例图片", 400
        img = Image.open(sample_path)
    else:
        return "请上传或选择图片", 400
    
    # 后面的模型预测逻辑完全复用原有代码即可,直接使用img对象处理
    # 【原有预测逻辑不变】

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:27:03