当前位置: 首页 > article >正文

python创建一个httpServer网页上传文件到httpServer

一、代码

1.server.py
import os 
from http.server import SimpleHTTPRequestHandler, HTTPServer 
import cgi 
 
# 自定义请求处理类
class MyRequestHandler(SimpleHTTPRequestHandler):
    # 处理GET请求
    def do_GET(self):
        if self.path == '/':
            # 响应200状态码
            self.send_response(200)
            # 设置响应头为text/html
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            # 读取并发送upload.html文件内容
            with open('upload.html', 'rb') as file:
                self.wfile.write(file.read())
        else:
            # 调用父类方法处理其他路径的GET请求
            super().do_GET()
 
    # 处理POST请求
    def do_POST(self):
        if self.path == '/upload':
            # 解析表单数据
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD': 'POST',
                         'CONTENT_TYPE': self.headers['Content-Type']}
            )
            if 'file' in form:
                file_item = form['file']
                if file_item.filename:
                    # 构建文件保存路径
                    file_path = os.path.join('uploads', file_item.filename)
                    # 将上传的文件保存到指定路径
                    with open(file_path, 'wb') as f:
                        f.write(file_item.file.read())
                    # 响应200状态码
                    self.send_response(200)
                    # 设置响应头为text/html
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    # 发送上传成功的消息
                    self.wfile.write('文件上传成功'.encode('utf-8'))
                else:
                    # 如果没有选择文件,返回400错误
                    self.send_error(400, '未选择文件')
            else:
                # 如果缺少文件字段,返回400错误
                self.send_error(400, '缺少文件字段')
        else:
            # 如果路径不存在,返回404错误
            self.send_error(404, '未找到')
 
# 主程序入口
if __name__ == '__main__':
    # 检查并创建上传目录
    if not os.path.exists('uploads'):
        os.makedirs('uploads')
 
    # 定义服务器端口号
    PORT = 8000 
    # 创建HTTP服务器
    with HTTPServer(('', PORT), MyRequestHandler) as httpd:
        print(f'服务器运行在端口 {PORT}')
        # 启动服务器,持续监听请求
        httpd.serve_forever()
2.upload.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
</head>
<body>
    <h1>上传文件</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <label for="file">选择要上传的文件:</label>
        <input type="file" id="file" name="file" required>
        <br><br>
        <button type="submit">上传</button>
    </form>
</body>
</html>
3.upload.html 可显示进度条
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
    <style>
        #progressBarContainer {
            width: 100%;
            background-color: #f3f3f3;
            margin-top: 10px;
        }
        #progressBar {
            width: 0%;
            height: 20px;
            background-color: #4caf50;
            text-align: center;
            line-height: 20px;
            color: white;
        }
    </style>
</head>
<body>
    <h1>上传文件</h1>
    <form id="uploadForm" enctype="multipart/form-data">
        <label for="file">选择要上传的文件:</label>
        <input type="file" id="file" name="file" required>
        <br><br>
        <div id="progressBarContainer">
            <div id="progressBar">0%</div>
        </div>
        <button type="button" onclick="uploadFile()">上传</button>
    </form>

    <script>
        function uploadFile() {
            var form = document.getElementById('uploadForm');
            var formData = new FormData(form);

            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/upload', true);

            // 更新进度条
            xhr.upload.onprogress = function(event) {
                if (event.lengthComputable) {
                    var percentComplete = (event.loaded / event.total) * 100;
                    var progressBar = document.getElementById('progressBar');
                    var progressText = document.createTextNode(Math.round(percentComplete) + '%');
                    progressBar.style.width = percentComplete + '%';
                    progressBar.innerHTML = ''; // 清空旧文本
                    progressBar.appendChild(progressText); // 添加新文本
                }
            };

            xhr.onload = function() {
                if (xhr.status === 200) {
                    alert('文件上传成功!');
                } else {
                    alert('文件上传失败!');
                }
            };

            xhr.onerror = function() {
                alert('上传过程中发生错误!');
            };

            xhr.send(formData);
        }
    </script>
</body>
</html>
4. serverOpen.bat
@echo off  
REM 关闭命令回显,使输出更干净 
python server.py
REM 启动命令提示符 
start cmd 

二、测试

在这里插入图片描述

双击serverOpen.bat运行httpServer
在这里插入图片描述

在这里插入图片描述

uploads文件夹下出现
在这里插入图片描述


http://www.kler.cn/a/515146.html

相关文章:

  • 如何有效使用Python爬虫将网页数据存储到Word文档
  • 【组件库】使用Vue2+AntV X6+ElementUI 实现拖拽配置自定义vue节点
  • 7.8 ChatGPT 开发者模式实战:第三方天气查询平台对接,如何打造爆款天气应用?
  • XCP 协议基础
  • 【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
  • 如何使用CRM数据分析优化销售和客户关系?
  • LightGBM算法
  • node安装与管理
  • Centos类型服务器等保测评整/etc/pam.d/system-auth
  • Typescript 多个泛型参数详细解读
  • HP 笔记本重新安装 Windows 11 无法启动
  • webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译
  • 【P2P】基于 Nebula 的 P2P 通信技术的虚拟局域网游戏设计方案
  • 低代码系统-产品架构案例介绍(四)
  • 【esp32小程序】小程序篇02——连接git
  • 大语言模型应用实践:性能与资源的权衡之道
  • Pytorch深度学习指南 卷I --编程基础(A Beginner‘s Guide) 第1章 一个简单的回归
  • Logo语言的网络编程
  • mac 电脑上安装adb命令
  • HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战
  • Chromium 132 编译指南 Mac 篇(四)- 获取源代码
  • 【Uniapp-Vue3】动态设置页面导航条的样式
  • 使用c#开发机器学习项目入门
  • java开发,IDEA转战VSCODE配置(mac)
  • 深入了解 Java 中的数组与字符串
  • 如何访问GitHub