nginx配置尝试

from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse, FileResponse, HTMLResponse
import logging
import os
from datetime import datetime
import uvicorn# 初始化日志
logging.basicConfig(filename='file_server.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)script_dir = os.path.dirname(os.path.abspath(__file__))
pro_dir = os.path.abspath(os.path.join(script_dir, '..'))
dir_upload = os.path.abspath(os.path.join(pro_dir, 'files'))app = FastAPI()@app.post("/upload_file/")
async def upload_file(file: UploadFile = File(...)):"""接收上传的文件,保存到服务器,并返回文件信息。"""# 验证文件格式if file.content_type != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":raise HTTPException(status_code=400, detail="上传文件格式不符合要求")try:# 读取文件的二进制内容file_content = await file.read()# 调用save_upload_file函数保存文件file_info = await save_upload_file(dir_upload, file_content)if file_info is not None:# 如果文件保存成功,则返回文件信息return JSONResponse(content=file_info)else:# 文件保存失败,返回错误信息return JSONResponse(content={"message": "文件保存失败"}, status_code=500)except Exception as e:logger.error("文件上传错误: %s", str(e))return JSONResponse(content={"message": "文件上传失败"}, status_code=500)# 定义并实现文件保存函数
async def save_upload_file(dir_upload, file_content) -> dict:try:# 确保上传目录存在if not os.path.exists(dir_upload):os.makedirs(dir_upload)# 使用当前时间戳生成文件名timestamp = datetime.now().strftime("%Y%m%d%H%M%S")file_name = f"{timestamp}.xlsx"file_path = os.path.join(dir_upload, file_name)# 保存文件到指定路径with open(file_path, "wb") as f:f.write(file_content)file_size = os.path.getsize(file_path)return {"file_name": file_name,"file_path": file_path,"file_size": file_size}except Exception as e:logger.error("文件保存失败: %s", str(e))return None@app.get("/get_file/", summary="get file", tags=['文件'])
async def get_file(file_name: str):"""根据文件名提供文件的 HTTP 服务"""try:file_path = os.path.join(dir_upload, file_name)if not os.path.exists(file_path):return JSONResponse(content={"message": "文件未找到"}, status_code=404)return FileResponse(file_path, media_type="application/octet-stream", filename=file_name)except Exception as e:logger.error("文件下载错误: %s", str(e))return JSONResponse(content={"message": str(e)}, status_code=500)@app.get("/list_files/", response_class=HTMLResponse)
async def list_files():"""提供文件列表的 HTML 页面和文件上传功能"""try:files = sorted((f for f in os.listdir(dir_upload) if os.path.isfile(os.path.join(dir_upload, f))),key=lambda f: os.path.getmtime(os.path.join(dir_upload, f)),reverse=True)if not files:files_html = "<h2>没有可下载的文件</h2>"else:file_links = [f'<li><a href="/get_file/?file_name={file}">{file}</a></li>' for file in files]files_html = f"<ul>{''.join(file_links)}</ul>"html_content = f"""<html><head><title>文件列表和上传</title><script>async function uploadFile(event) {{event.preventDefault();const formData = new FormData();const fileField = document.querySelector('input[type="file"]');formData.append('file', fileField.files[0]);const response = await fetch('/upload_file/', {{method: 'POST',body: formData}});const result = await response.json();alert(result.message || '文件上传成功');window.location.reload();}}</script></head><body><h1>文件列表和上传</h1><form onsubmit="uploadFile(event)"><input type="file" name="file" accept=".xlsx" required><button type="submit">上传文件</button></form><h2>文件列表</h2>{files_html}</body></html>"""return HTMLResponse(content=html_content)except Exception as e:logger.error("文件列表生成错误: %s", str(e))return HTMLResponse(content=f"<h2>错误: {str(e)}</h2>", status_code=500)if __name__ == "__main__":## 线上模式# uvicorn.run("file_server:app", host="0.0.0.0", port=1300)## debug 模式uvicorn.run("file_server:app", host="0.0.0.0", port=1300, reload=True)

运行上述代码,打开http://127.0.0.1:1300/docs#/


接下来配置nginx文件

user _www;
worker_processes auto;
error_log /opt/homebrew/var/log/nginx/error.log;
pid /System/Volumes/Data/opt/homebrew/var/run/nginx.pid;# Events
events {worker_connections 1024;
}http {include /opt/homebrew/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 /opt/homebrew/var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;types_hash_max_size 2048;gzip on;server {listen 81;server_name localhost;location /file/ {proxy_pass http://127.0.0.1:1300/upload_file/;}location /get_file/ {proxy_pass http://127.0.0.1:1300/get_file/;}location /list_files/ {proxy_pass http://127.0.0.1:1300/list_files/;}}
}

接下来:

访问http://127.0.0.1:81/list_files/   http://127.0.0.1:1300/list_files/ 均可以打开对应网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细的讲解一下网络变压器应用POE ,AT BT AF BF的概念,做电路连接指导分析

网络变压器在应用POE&#xff08;Power over Ethernet&#xff09;技术时&#xff0c;承担着重要的角色。它不仅负责数据的传输&#xff0c;同时也为网络设备提供电力。在IEEE 802.3标准中&#xff0c;定义了几个与POE相关的标准&#xff0c;包括802.3af、802.3at、802.3bt等&a…

智慧景区解决方案PPT(89页)

智慧景区解决方案摘要 解决方案概述智慧景区解决方案旨在利用现代信息技术解决景区管理机构面临的保护与发展矛盾&#xff0c;推动服务职能转变&#xff0c;促进旅游产业跨越式发展&#xff0c;实现旅游经营增长和管理成本优化。 宏观政策背景国家旅游局发布的《“十三五”全国…

VideoAgent——使用大规模语言模型作为代理来理解长视频

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.10517 本研究引入了一个新颖的基于代理的系统&#xff0c;名为 VideoAgent。该系统以大规模语言模型为核心&#xff0c;负责识别关键信息以回答问题和编辑视频。VideoAgent 在具有挑战性的 EgoSchema 和 NExT-QA 基准上进…

TD-MPC(Temporal Difference Model Predictive Control)人形机器人行走举例

td-mpc控制机器人行走举例 TD-MPC(Temporal Difference Model Predictive Control)是一种结合了时序差分学习和模型预测控制的强化学习方法,特别适用于控制复杂系统如人形机器人行走任务。TD-MPC通过使用模型预测控制(MPC)在已学到的环境模型中进行多步预测和优化,再结合…

数据特征采样在 MySQL 同步一致性校验中的实践

作者&#xff1a;vivo 互联网存储研发团队 - Shang Yongxing 本文介绍了当前DTS应用中&#xff0c;MySQL数据同步使用到的数据一致性校验工具&#xff0c;并对它的实现思路进行分享。 一、背景 在 MySQL 的使用过程中&#xff0c;经常会因为如集群拆分、数据传输、数据聚合等…

qt 播放视频

在 Qt 中播放视频&#xff0c;你可以使用 Qt Multimedia 模块。这个模块提供了处理音频和视频内容的功能。以下是一个简单的例子&#xff0c;展示了如何使用 QMediaPlayer 和 QVideoWidget 来播放视频&#xff1a; 包含必要的头文件&#xff1a; #include <QMediaPlayer&g…

容器:queue(队列)

以下是关于queue容器的总结 1、构造函数&#xff1a;queue [queueName] 2、添加、删除元素: push() 、pop() 3、获取队头/队尾元素&#xff1a;front()、back() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#xff1a;empty() #include <iostream> #include …

一个简单的spring+kafka生产者

1. pom <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>2. 生产者 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; impo…

https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件

文章目录 前言https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件1, 检查openssl的版本2. 生成私钥和证书签署请求 (CSR)3. 生成自签名证书4. 将证书和私钥转换为 PKCS12 格式的密钥库5. 创建信任库 (Truststore)6. 将 PKCS12 文件转换为 JKS 文件7.…

IDEA安装IDE Eval Reset插件,30天自动续期,无限激活

第一步&#xff1a; 下载idea 注意&#xff1a;版本要是2021.2.2以下 第二步&#xff1a;快捷键CtrlAlts打开设置 第三步&#xff1a;打开下图中蓝色按钮 第四步&#xff1a;点击弹窗的 “” &#xff0c;并输入 plugins.zhile.io 点击 “ok” 第五步&#xff1a;搜索IDE Ea…

前端必修技能:高手进阶核心知识分享 - CSS mix-blend-mode 图片混合模式详解

标签定义及使用说明 mix-blend-mode 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。 语法 mix-blend-mod: 使用mix-blend-mode 各种混合模式实例 注意: Internet Explorer 或 Edge 浏览器不支持 mix-blend-mode 属性。 &#xff08;还是那个熟…

AJAX-个人版-思路步骤整理版

前置知识&#xff1a;老式的web创建工程方法就是创建项目然后添加web工件&#xff0c;然后添加lib依赖如&#xff1a;tomcat,servlet&#xff0c;等。 传统请求 对于传统请求操作&#xff1a;整体流程也就是创建静态页面&#xff0c; <!DOCTYPE html> <html lang&q…

CSS技巧:用CSS绘制超写实的酷炫徽章缎带效果,超漂亮,超酷炫

为什么要用CSS来画个徽章&#xff1f;这货脑子进水了吧&#xff01; 今天在电脑前设计&#xff0c;要做徽章效果。突然觉得可以尝试用css实现近似的效果。说干就干&#xff0c;打开编辑器&#xff0c;让我的手指头活跃起来&#xff01; 技术要点 通过多个圆形嵌套和渐变属性…

【Rust练习】1.变量绑定与解构

地址&#xff1a;https://practice-zh.course.rs/variables.html &#x1f31f; 变量只有在初始化后才能被使用 // 修复下面代码的错误并尽可能少的修改 fn main() {let x: i32; // 未初始化&#xff0c;但被使用let y: i32; // 未初始化&#xff0c;也未被使用println!(&quo…

WIN32核心编程 - 线程操作(一) 线程信息 - 线程控制

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 Thread Thread Control 创建 - Create 执行 - Execute 挂起 - Suspend 恢复 - Resume 终止 - Terminate 远程 - Remote Thread Info GetCurrentThread/Id GetThreadContext CreateToo…

Vue iview-ui 被tooltip包裹的标题,点击跳转后,提示框不消失

tooltip包裹的标题&#xff0c;点击跳转后&#xff0c;提示框不消失 就会有这种显示问题 下面这种错误方法不可行&#xff0c;解决办法往下翻 css写得没错&#xff0c;问题出在Javascript当中的 getElementsByClassName(“xxabc”)&#xff0c; 这个方法得到的是一个由class&q…

【Android】【WIFI】检查 SDIO 设备的状态

检查 SDIO 设备的状态 要检查 Android 设备上 SDIO 设备的状态&#xff0c;可以使用 ADB 命令来获取系统信息。以下是一些示例命令&#xff1a; 列出 SDIO 设备 adb shell cat /proc/devices | grep sdio检查 SDIO 模块是否加载 adb shell lsmod | grep sdio获取 SDIO 相关的…

IDEA中使用Maven打包及碰到的问题

1. 项目打包 IDEA中&#xff0c;maven打包的方式有两种&#xff0c;分别是 install 和 package &#xff0c;他们的区别如下&#xff1a; install 方式 install 打包时做了两件事&#xff0c;① 将项目打包成 jar 或者 war&#xff0c;打包结果存放在项目的 target 目录下。…

自闭症在生活中的典型表现

自闭症&#xff0c;这个看似遥远却又悄然存在于我们周围的疾病&#xff0c;其影响深远且复杂。在日常生活中&#xff0c;自闭症患者的典型表现往往让人印象深刻&#xff0c;这些表现不仅揭示了他们内心的世界&#xff0c;也提醒我们要以更加包容和理解的心态去面对他们。 首先…

R语言4.3.0保姆级安装教程,包含安装包

[软件名称]&#xff1a;R语言4.3.0 R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;它是一个用于统计计算和统计制图的优秀工具。 获取链接: https://pan.quark.cn/s/180306f47179 安装步骤: 1.解压压缩包。 2.进入…