摘要
Python fastapi 做一个图片和文件视频的服务,以下是一个使用 FastAPI 构建的简单图片、文件和视频服务的示例代码。该服务允许你上传文件,并提供文件下载的接口。fastapi-file-serviceFastAPI 图片和文件视频服务代码V1生成 file_service.py。
fastapi-file-serviceFastAPI
图片和文件视频服务代码
V1
file_service.py
import os
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse
app = FastAPI()
# 定义存储文件的目录
UPLOAD_DIR = "uploads"
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
try:
file_path = os.path.join(UPLOAD_DIR, file.filename)
with open(file_path, "wb") as f:
contents = await file.read()
f.write(contents)
return {"filename": file.filename, "message": "文件上传成功"}
except Exception as e:
return {"message": f"文件上传失败: {str(e)}"}
@app.get("/download/{filename}")
async def download_file(filename: str):
file_path = os.path.join(UPLOAD_DIR, filename)
if os.path.exists(file_path):
return FileResponse(file_path)
return {"message": "文件未找到"}
代码解释
- 导入必要的库:导入
FastAPI
、File
、UploadFile
和FileResponse
这些 FastAPI 相关的类。 - 创建 FastAPI 应用:
app = FastAPI()
创建了一个 FastAPI 应用实例。 - 创建存储目录:检查
uploads
目录是否存在,如果不存在则创建它。 - 文件上传接口:
/upload/
接口接收一个文件,将其保存到uploads
目录中。 - 文件下载接口:
/download/{filename}
接口根据文件名从uploads
目录中查找文件,如果存在则返回文件响应。
运行步骤
- 保存上述代码为
file_service.py
。 - 打开终端,进入代码所在目录。
- 运行以下命令启动 FastAPI 服务:
bash
uvicorn file_service:app --reload
- 你可以使用工具(如 Postman)向
http://localhost:8000/upload/
发送文件进行上传,向http://localhost:8000/download/{filename}
发送请求进行文件下载。
显示和视频播放的 API.
在之前的代码基础上添加显示图片和播放视频的 API。这里我们使用 StreamingResponse
来流式传输图片和视频数据。
fastapi-file-serviceFastAPI 图片和文件视频服务代码
V2
file_service.py
import os
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse, StreamingResponse
app = FastAPI()
# 定义存储文件的目录
UPLOAD_DIR = "uploads"
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
try:
file_path = os.path.join(UPLOAD_DIR, file.filename)
with open(file_path, "wb") as f:
contents = await file.read()
f.write(contents)
return {"filename": file.filename, "message": "文件上传成功"}
except Exception as e:
return {"message": f"文件上传失败: {str(e)}"}
@app.get("/download/{filename}")
async def download_file(filename: str):
file_path = os.path.join(UPLOAD_DIR, filename)
if os.path.exists(file_path):
return FileResponse(file_path)
return {"message": "文件未找到"}
@app.get("/display_image/{filename}")
async def display_image(filename: str):
file_path = os.path.join(UPLOAD_DIR, filename)
if os.path.exists(file_path):
def iterfile():
with open(file_path, mode="rb") as file_like:
yield from file_like
return StreamingResponse(iterfile(), media_type="image/jpeg")
return {"message": "图片未找到"}
@app.get("/play_video/{filename}")
async def play_video(filename: str):
file_path = os.path.join(UPLOAD_DIR, filename)
if os.path.exists(file_path):
def iterfile():
with open(file_path, mode="rb") as file_like:
yield from file_like
return StreamingResponse(iterfile(), media_type="video/mp4")
return {"message": "视频未找到"}
代码解释
- 导入
StreamingResponse
:用于流式传输文件内容。 - 显示图片 API:
/display_image/{filename}
接口接收图片文件名,若文件存在则以流式传输的方式返回图片数据,媒体类型为image/jpeg
。 - 播放视频 API:
/play_video/{filename}
接口接收视频文件名,若文件存在则以流式传输的方式返回视频数据,媒体类型为video/mp4
。
注意事项
- 这里假设图片格式为 JPEG,视频格式为 MP4,你可以根据实际情况修改
media_type
。 - 确保上传的文件存储在
uploads
目录下。
运行步骤与之前相同,启动服务后,你可以通过相应的 API 来显示图片和播放视频。
能否用URL call
当然可以,为了让你可以通过 URL 调用这些接口,我们可以使用 Python 的 requests
库来发送 HTTP 请求,以下是示例代码:
若要访问之前构建的 FastAPI 服务中的各个接口,可通过不同途径达成,以下为你详细介绍:
1. 使用浏览器访问
- 显示图片:
当你要显示上传的图片时,可在浏览器地址栏输入类似如下的 URL:plaintext
http://localhost:8000/display_image/your_image.jpg
把your_image.jpg
替换成你实际上传的图片文件名。若图片存在,浏览器会直接展示该图片。 - 播放视频:
若要播放上传的视频,在浏览器地址栏输入如下 URL:plaintext
http://localhost:8000/play_video/your_video.mp4
把your_video.mp4
替换成你实际上传的视频文件名。部分浏览器可直接播放视频,有些则可能需要你手动下载后再用视频播放器播放。
2. 使用命令行工具(如 curl
)访问
- 上传文件:
借助curl
命令上传文件,示例如下:bash
curl -X POST "http://localhost:8000/upload/" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@your_file.jpg"
这里的your_file.jpg
要替换成你实际要上传的文件名。 - 下载文件:
运用curl
命令下载文件,示例如下:bash
curl -o downloaded_file.jpg "http://localhost:8000/download/your_file.jpg"
把your_file.jpg
替换成你要下载的文件名,downloaded_file.jpg
是下载后保存的文件名,可按需修改。 - 显示图片:
若要显示图片,可使用以下命令:bash
curl -o displayed_image.jpg "http://localhost:8000/display_image/your_image.jpg"
把your_image.jpg
替换成实际的图片文件名,displayed_image.jpg
是保存图片的文件名。 - 播放视频:
若要获取视频,可使用以下命令:bash
curl -o played_video.mp4 "http://localhost:8000/play_video/your_video.mp4"
把your_video.mp4
替换成实际的视频文件名,played_video.mp4
是保存视频的文件名。
3. 使用 Python 的 requests
库访问
你可以参考之前提供的使用 requests
库的代码示例,修改相应的文件名和 URL 地址,运行 Python 脚本来访问各个接口。
注意事项
- 要保证你的 FastAPI 服务已经启动,并且运行在
http://localhost:8000
上。如果服务运行在其他地址或端口,需相应修改上述 URL 中的地址和端口信息。 - 对于文件上传和下载,要确保文件路径和文件名准确无误。