You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python Flask服务器中取回图片?已实现Android端上传功能

实现Flask服务器的图片取回功能

嘿,很高兴你已经搞定了Android到Flask的图片上传!要实现从Flask服务器取回图片的需求,咱们可以分两种场景来处理:一种是给你的Android端(或其他客户端)提供接口来请求获取图片,另一种是如果只是服务器内部需要读取上传的图片,直接操作文件系统就好。我来给你详细说明:

一、给客户端提供图片获取接口

这是最常用的场景——上传图片后,客户端可以通过URL来请求下载对应的图片。Flask内置了send_from_directory函数,专门用来处理静态文件的返回,咱们可以利用它来实现这个功能:

首先,先在代码里导入这个函数,然后新增一个路由来处理图片请求:

import flask
import werkzeug
import time
import os
from flask import send_from_directory  # 新增导入

app = flask.Flask(__name__)
from readFileLastest import newest

# 定义上传目录(建议把路径改成相对路径,方便后续移植)
UPLOAD_FOLDER = r'C:\Users\User\Desktop\AndroidFlask-master\Part 1\FlaskServer\uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/', methods = ['GET', 'POST'])
def handle_request():
    n = 0
    files_ids = list(flask.request.files)
    print("\nNumber of Received Images : ", len(files_ids))
    image_num = 1
    for file_id in files_ids:
        print("\nSaving Image ", str(image_num), "/", len(files_ids))
        imagefile = flask.request.files[file_id]
        filename = werkzeug.utils.secure_filename(imagefile.filename)
        print("Image Filename : " + imagefile.filename)
        # 可选:如果担心文件名重复,可以给文件名加上时间戳
        # timestr = time.strftime("%Y%m%d-%H%M%S")
        # filename = f"{timestr}_{filename}"
        imagefile.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        image_num = image_num + 1
    print("\n")
    return "Image(s) Uploaded Successfully. Come Back Soon."

# 新增的图片获取路由
@app.route('/get-image/<filename>', methods=['GET'])
def get_image(filename):
    try:
        # send_from_directory会自动识别文件类型,返回正确的响应头
        return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
    except FileNotFoundError:
        # 如果请求的文件不存在,返回404错误
        return flask.abort(404)

# 可选:新增一个列出所有上传图片的接口,方便客户端查看可选图片
@app.route('/list-images', methods=['GET'])
def list_images():
    # 过滤出目录里的文件(排除子目录)
    files = [f for f in os.listdir(app.config['UPLOAD_FOLDER']) if os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], f))]
    return flask.jsonify({"images": files})

app.run(host="0.0.0.0", port=8888, debug=True)

接口使用示例

  • 假设你上传了一张名为test.jpg的图片,在浏览器或Android端访问http://你的服务器IP:8888/get-image/test.jpg,就能直接查看或下载这张图片。
  • 访问http://你的服务器IP:8888/list-images,可以获取所有上传图片的文件名列表,方便客户端选择要获取的图片。

二、服务器内部读取图片

如果只是在Flask的其他函数里需要读取上传的图片(比如做图片处理),直接用Python的文件操作或者图像处理库就行。比如用open读取二进制内容,或者用Pillow来处理:

# 示例:读取最新上传的图片(复用你导入的newest函数)
@app.route('/process-latest-image', methods=['GET'])
def process_latest_image():
    latest_file = newest(app.config['UPLOAD_FOLDER'])
    if not latest_file:
        return "No images uploaded yet."
    
    # 读取图片二进制内容
    with open(os.path.join(app.config['UPLOAD_FOLDER'], latest_file), 'rb') as f:
        image_data = f.read()
    
    # 如果你需要用Pillow处理图片(需先安装pip install pillow)
    # from PIL import Image
    # img = Image.open(os.path.join(app.config['UPLOAD_FOLDER'], latest_file))
    # 这里可以添加图片处理逻辑,比如调整尺寸、添加滤镜等
    
    return f"Processed latest image: {latest_file}, size: {len(image_data)} bytes"

一些实用提醒

  • 确保uploads目录的权限正确,Flask运行的进程要有读取该目录的权限。
  • 如果需要限制图片访问,可以给get-image路由添加权限验证(比如token校验),防止陌生人随意访问你的图片。
  • 若要长期存储图片,建议考虑将文件存储到云存储服务(比如阿里云OSS、AWS S3),避免服务器本地存储的容量和可靠性问题。

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

火山引擎 最新活动