如何在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




