文件图片等数据的上传服务和下载服务实现
如何实现文件数据的上传服务和下载服务
目录
引言
在现代应用中,文件上传和下载是非常常见的需求。无论是用户上传图片、文档,还是下载报告、数据文件,良好的文件管理服务都是必不可少的。本文将详细介绍如何实现一个简单的文件上传和下载服务,使用Python的FastAPI框架和Nginx作为反向代理服务器。
文件上传服务
2.1 上传服务概述
文件上传服务允许用户将文件上传到服务器,并将其存储在指定的路径中。我们将使用FastAPI框架来实现这个服务。FastAPI是一个现代的、快速的(高性能)Web框架,适合构建API。
2.2 上传服务的实现
2.2.1 环境准备
在开始之前,确保你已经安装了以下软件:
- Python 3.7+
- FastAPI
- Uvicorn(用于运行FastAPI应用)
- Nginx(用于反向代理)
可以使用以下命令安装FastAPI和Uvicorn:
pip install fastapi uvicorn
2.2.2 代码实现
以下是实现文件上传服务的代码示例。我们将创建一个名为file_writer_server.py
的Python文件。
# -*- encoding: utf-8 -*-
"""
@File : file_writer_server.py
@Description : 文件上传服务
@Author : 一只特立独行的羱
@License : (C)Copyright 2019-2030,xx
"""
import os
import sys
import uvicorn
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI, UploadFile, File, Form
# api对象
app = FastAPI()
# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许所有源
allow_credentials=True,
allow_methods=["*"], # 允许所有方法
allow_headers=["*"], # 允许所有头
)
import argparse
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='这是一个接收文件并存储的服务,请带根路径参数运行!')
# 添加参数
parser.add_argument('--root_path', type=str, default='/data/extdocker/nginx/upload/', help='存储目录的根路径')
# 解析参数
args = parser.parse_args()
root_path = args.root_path
if not os.path.exists(root_path):
raise AssertionError(f'{root_path},该路径不存在,请带入正确的存储目录的根路径。')
else:
print(f'root path:{root_path}')
@app.post("/upload")
async def upload_file_and_write(file: UploadFile = File(...),
relative_path: str = Form(None, description="要存储的相对路径")):
# relative_path必须是相对路径
if relative_path.startswith(os.sep):
relative_path = relative_path[1:]
try:
# 确保上传目录存在
upload_dir = os.path.join(root_path, relative_path)
if not os.path.exists(upload_dir):
os.makedirs(upload_dir)
# 生成文件路径
file_path = os.path.join(upload_dir, file.filename)
print(f"current file path to write: {file_path}")
# 将文件内容写入磁盘
with open(file_path, "wb") as buffer:
buffer.write(await file.read())
print(f"file {file_path} is written.")
return JSONResponse(content={"filename": os.path.relpath(file_path, root_path), "message": "文件上传成功"}, status_code=200)
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)
if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=9098, workers=1)
代码解析
- 导入库:我们导入了 FastAPI、Uvicorn、JSONResponse 和 CORS 中间件等必要的库。
- 创建 FastAPI 应用:通过
FastAPI()
创建一个应用实例。 - CORS 中间件:允许所有源进行跨域请求,方便前端与后端的交互。
- 命令行参数:使用
argparse
来获取存储文件的根路径。 - 上传接口:定义了一个 POST 接口
/upload
,用于接收文件和相对路径参数。 - 文件存储逻辑:
- 检查并创建上传目录。
- 将上传的文件写入指定路径。
- 返回上传成功的响应。
2.2.3 启动服务
在终端中运行以下命令以启动服务:
python file_writer_server.py --root_path /data/extdocker/nginx/upload/
此时,服务将监听9098端口,等待文件上传请求。
2.3 上传服务的测试
可以使用Postman或cURL工具测试上传服务。以下是使用cURL的示例命令:
curl -X POST "http://<替换为你的IP>:9098/upload" -F "file=@/path/to/your/file.jpg" -F "relative_path=daipd/pest/"
如果上传成功,将返回一个JSON响应,包含文件名和成功消息。
文件下载服务
3.1 下载服务概述
文件下载服务允许用户从服务器下载存储的文件。我们将使用Nginx作为反向代理服务器来处理下载请求。
3.2 下载服务的实现
3.2.1 Nginx配置
为了能够通过 HTTP 访问上传的文件,我们需要配置 Nginx。以下是 Nginx 的配置文件示例:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
client_max_body_size 100M;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name 0.0.0.0 localhost 127.0.0.1;
location /upload {
add_header 'Access-Control-Allow-Origin' '*';
alias /data/extdocker/nginx/upload/; # 修改为实际的上传目录
index index.html;
charset utf-8; # 设置字符集
}
}
}
Nginx 配置文件解析
- 基本配置:设置用户、工作进程和错误日志等基本信息。
- HTTP 配置:包括 MIME 类型、日志格式、文件传输设置等。
- server 块:监听 80 端口,配置上传文件的访问路径。
- location 块:配置
/upload
路径的访问,允许跨域请求,并指定文件存储的实际路径。
配置完成后,重启Nginx以使更改生效:
sudo systemctl restart nginx
3.2.2 下载服务的代码实现
下载服务不需要额外的代码实现,因为Nginx将处理文件的下载请求。用户只需通过HTTP GET请求访问文件的URL即可。
例如,下载文件的URL格式如下:
http://<替换为你的IP>:9070/upload/crop_diseases/daipd/pest/402891cc6301912.jpg
3.3 下载服务的测试
可以在浏览器中直接输入下载链接,或者使用cURL命令下载文件:
curl -O "http://<替换为你的IP>:9070/upload/crop_diseases/daipd/pest/402891cc6301912101630191453e009a/402891cc6301c8ec016301c95a4b0b58/2.jpg"
如果下载成功,文件将被保存到当前目录。
总结
本文详细介绍了如何实现一个简单的文件上传和下载服务。我们使用FastAPI框架构建了文件上传服务,并通过Nginx实现了文件下载服务。通过这些步骤,您可以轻松地在自己的项目中实现文件管理功能。
参考资料
原文地址:https://blog.csdn.net/A15216110998/article/details/143858929
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!