FastAPI实现文件上传下载

news/2024/10/18 12:32:40/

FastAPI实现文件上传下载

  • 1.后端FastAPI
  • 2.后端html
  • 3.效果

最近的项目需求,是前端vue,后端fastAPI,然后涉及到图像的消息发送,所以需要用fast写文件上传下载的接口,这里简单记录一下。

1.后端FastAPI

import os.path
import uvicorn
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(# 解决跨域问题CORSMiddleware,allow_origins=["*"],  allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)
#@app.get("/")#测试接口
#async def hello():
#   return {"ret": 'hello'}
@app.post("/uploadfile/")#前端上传的文件会放在文件目录下的uploaded_files目录下
async def create_upload_file(file: UploadFile = File(...)):print(file)if not os.path.exists('uploaded_files'):os.mkdir('uploaded_files')with open(f"uploaded_files/{file.filename}", "wb") as f:f.write(await file.read())return {"filename": file.filename}@app.get("/downloadfile/{filename}")#前端会传递一个文件名,然后从后端文件目录的downloadfile目录下找到这个文件去下载
async def download_file(filename: str):directory_path = f"{os.path.dirname(__file__)}/downloadfile/"file_path = os.path.join(directory_path, filename)print(file_path)return FileResponse(file_path, media_type="application/octet-stream", filename=filename)
if __name__ == '__main__':uvicorn.run('upload:app', host='127.0.0.1', port=18005, reload=False)

2.后端html

我用postman测试后端没问题后,用html搞了一个简单的前端,实现这个功能,这里从后端下载文件到前端时需要前端给一个文件名,这个文件名一定要是后端/downloadfile/文件夹下的文件名,否则下载不到文件。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传与下载</title>
</head>
<body><h1>文件上传与下载d</h1><!-- 文件上传表单 -->
<form id="uploadForm" enctype="multipart/form-data"><input type="file" id="fileInput" name="file" accept=".txt"><button type="button" onclick="uploadFile()">上传</button>
</form><!-- 文件下载按钮 -->
<input type="text" id="fileNameInput" placeholder="输入后端downloadfile文件夹下的文件名">
<button onclick="downloadFile()">下载</button><script>async function uploadFile() {const fileInput = document.getElementById('fileInput');const file = fileInput.files[0];if (file) {const formData = new FormData();formData.append('file', file);try {const response = await fetch('http://127.0.0.1:18005/uploadfile/', {method: 'POST',body: formData});if (response.ok) {alert('文件上传到后端upload_files目录下成功!');} else {alert('文件上传失败.');}} catch (error) {console.error(error);alert('文件上传失.');}} else {alert('请选择需要上传的文件.');}}async function downloadFile() {// 获取输入框中的文件名const fileName = document.getElementById("fileNameInput").value;try {// 使用 fetch 请求下载文件const response = await fetch(`http://127.0.0.1:18005/downloadfile/${fileName}`);if (response.ok) {// 将文件转换为 Blobconst blob = await response.blob();// 创建一个链接并设置下载属性const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);link.download = fileName;// 模拟点击下载链接link.click();} else {alert('从后端downloadfile目录里下载此文件失败.');}} catch (error) {console.error(error);alert('下载文件出错.');}
}</script>
</body>
</html>

3.效果

在这里插入图片描述


http://www.ppmy.cn/news/1279089.html

相关文章

LeetCode刷题--- 目标和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

福FLUKE禄克8808A数字多用表

福禄克8808A&#xff0c;用于制造、研发、维修等应用的多功能数字表&#xff0c;FLUKE 8808A 5.5位数字多用表可以完成当今众多常用的测量工作。无论是功能测 展开 福禄克8808A&#xff0c;用于制造、研发、维修等应用的多功能数字表&#xff0c;FLUKE 8808A 5.5位数字多用表可…

点击筛选框动态增加 多条可输入Table列 以及通过操作数组改造数据

点击筛选框动态增加 多条可输入Table列 以及通过操作数组改造数据 <el-col :span"8" class"tab_group"><el-form-item label"动态筛选"><el-select v-model.trim"ruleForm.flowType" placeholder"请选择" …

在Linux上安装CLion

本教程将指导你如何在Linux系统上安装CLion&#xff0c;下载地址为&#xff1a;https://download.jetbrains.com.cn/cpp/CLion-2022.3.3.tar.gz。以下是详细的安装步骤&#xff1a; 步骤1&#xff1a;下载CLion 首先&#xff0c;你需要使用wget命令从提供的URL下载CLion的tar…

JavaWeb笔记之SVN

一、版本控制 软件开发过程中 变更的管理&#xff1b; 每天的新内容;需要记录一下&#xff1b; 版本分支;整合到一起&#xff1b; 主要的功能对于文件变更的追踪&#xff1b; 多人协同开发的情况下,更好的管理我们的软件。 大型的项目;一个团队来进行开发; 1: 代码的整合 2: 代…

数字信号的理解

1 数字信号处理简介 数字信号处理 digital signal processing&#xff08;DSP&#xff09;经常与实际的数字系统相混淆。这两个术语都暗示了不同的概念。数字信号处理在本质上比实际的数字系统稍微抽象一些。数字系统是涉及的硬件、二进制代码或数字域。这两个术语之间的普遍混…

服务器经常死机怎么办?如何处理

关于服务器死机这一话题相信大家是不会陌生的&#xff0c;平时在使用服务器的过程中&#xff0c;或多或少都是会有遇到过。轻则耽误业务开展&#xff0c;重则造成数据丢失&#xff0c;相信每个人都不想碰到服务器死机的情况。下文我也简单的介绍下服务器死机的原因以及对应的预…

2312llvm,07clang静态分析器

Clang静态分析器 理解静态分析器 在总体LLVM设计中,如果项目操作原始的(C/C)源码,就属于Clang前端,因为根据LLVMIR恢复源码层信息是很难的. 基于Clang的最有意思工具之一是Clang静态分析器,类似传统编译器的警告,在更小范围中,它用一套检查器来生成详细的漏洞报告. 每个检查…