利用QT通过http协议,来实现上传文件功能

news2025/3/14 0:02:50

#假如你有一台服务器,你最想做哪些事?#

大体上的软件界面如下:

主要阐述一哈写的这个软件实现的功能:

通过名称找到指定的文件,并且将文件按照后缀名的格式进行分开,最后再将所有找到的文件,进行上传到目标服务器的指定位置。

为了实现上述功能,一共采用了一下内容:

利用python搭建了一个简易的服务器,用来模拟接收上传文件的接口。

利用QT5.15.2写了一个软件,这个软件包含软件界面,和配置ini文件。

在这里主要是想讲一哈python如何实现服务器的搭建。

第一种是在cmd命令里面写:

python -m http.server

默认是打开的8000的端口

第二种是写一个简单的python的代码来实现服务器的功能

具体代码如下:

from http.server import BaseHTTPRequestHandler, HTTPServer
import os
import urllib.parse


# 定义HTTP请求处理类
class FileUploadHandler(BaseHTTPRequestHandler):
    # 处理POST请求
    def do_POST(self):
        # 解析Content-Length头部,获取上传文件大小
        content_length = int(self.headers['Content-Length'])
        # 解析Content-Disposition头部,获取上传文件名
        cd_header = self.headers.get('Content-Disposition')
        filename = urllib.parse.unquote(cd_header)

        # 读取上传的文件数据
        file_data = self.rfile.read(content_length)

        # 保存上传的文件
        with open(filename, 'wb') as f:
            f.write(file_data)

            # 设置响应状态码为200,表示成功接收文件
        self.send_response(200)
        self.end_headers()
    def do_GET(self):
        if self.is_first_request:
            self.is_first_request = False
            for k in dir(self):
                v = getattr(self, k)
                # 魔术方法,私有变量和大部分的callable并不是为我们提供的,所以排除
                if k.startswith('_') or callable(v):
                    continue
                print('---arg: ', k, ' type:', v.__class__.__name__, '\n', v, '\n\n', sep='')



server = HTTPServer(('localhost', 8080), FileUploadHandler)
print('Server started on port 8080...')

# 进入请求处理循环
server.serve_forever()

在上述代码中,我们创建了一个名为FileUploadHandler的HTTP请求处理类,并覆盖了do_POST方法以处理POST请求。在do_POST方法中,我们获取上传文件的大小,读取文件数据,我们增加了对Content-Disposition头部的解析,从中获取上传文件的文件名。然后,我们使用获取到的文件名保存上传的文件,从而保持原文件名不变。需要注意的是,为了避免文件名中包含特殊字符导致的问题,我们使用urllib.parse.unquote函数对文件名进行URL解码。然后,我们设置响应状态码为200,表示成功接收文件。最后,我们创建了一个HTTP服务器实例,并启动服务器以监听来自localhost的8080端口的请求。

另外值得一提的是:

搭建一个服务器需要以下要素:

  1. 硬件设备:包括计算机、硬盘、内存、网卡等。计算机应具备足够的内存以处理大量数据和多个连接,如果需要支持多个网站或许多并发连接,可能需要更大的内存。硬盘空间应足够大,以存储操作系统文件、网页文件、数据库和其他必要的文件。网卡则需要能够处理多个网络连接。
  2. 操作系统:应选择适合自己服务器的操作系统,常见的服务器操作系统包括Windows Server、Linux和Unix。
  3. 环境搭建部署:包括选择熟悉的环境,选择数据库以及应用中间件。
  4. 网站应用部署:创建新的网站应用,并配置为本地自己的网站应用目录。
  5. 网站发布:启用解析映射,添加映射。

然后就是在QT里面写上传文件的代码部分

实现的具体代码如下所示:

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);//定义multi的方式
    // 创建一个QNetworkAccessManager对象,用于处理网络请求
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);


    QString uploadFileName = directory+"/"+goal;//获取文件路径
    qDebug()<<uploadFileName<<"     "<<http;
    // 创建一个QNetworkRequest对象,使用指定的URL
    QNetworkRequest request(http);

    // 创建一个文件数据部分,将文件添加到多部分表单数据中
    QString filePath = uploadFileName; // 要上传的文件路径
    QFile *file = new QFile(filePath);
    file->open(QIODevice::ReadOnly);
    QHttpPart filePart;
    filePart.setBodyDevice(file);
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant( QFileInfo(filePath).fileName() ));
    multiPart->append(filePart);

    // 创建一个QNetworkReply对象,用于接收上传的响应
    QNetworkReply *reply = manager->post(request, multiPart);

    // 连接QNetworkReply的信号,以处理上传的响应数据
    connect(reply, &QNetworkReply::finished, this, [=]() {
        if (reply->error() == QNetworkReply::NoError) {
            // 上传成功,处理响应数据
        QString response = reply->readAll();
            qDebug()<<"成功"<<response;
            // ...
        } else {
            // 上传失败,处理错误信息
        qDebug() << "Upload failed: " << reply->errorString();
        }
        // 清理资源
        reply->deleteLater();
        multiPart->deleteLater();
        file->deleteLater();
    });
  1. QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);:创建一个QHttpMultiPart对象,用于构建多部分表单数据,以便进行文件上传。
  2. QNetworkAccessManager *manager = new QNetworkAccessManager(this);:创建一个QNetworkAccessManager对象,它是Qt中用于处理网络请求的核心类。
  3. QString uploadFileName = directory+"/"+goal;:根据目录和文件名拼接出要上传的文件的完整路径。
  4. qDebug()<<uploadFileName<<" "<<http;:输出上传文件的路径和HTTP地址,用于调试。
  5. QNetworkRequest request(http);:创建一个QNetworkRequest对象,使用指定的HTTP地址。
  6. QFile *file = new QFile(filePath);:创建一个QFile对象,打开要上传的文件。
  7. file->open(QIODevice::ReadOnly);:以只读模式打开文件。
  8. QHttpPart filePart;:创建一个QHttpPart对象,用于表示文件数据部分。
  9. filePart.setBodyDevice(file);:将文件设置为QHttpPart的body部分。
  10. filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QFileInfo(filePath).fileName()));:设置QHttpPart的头部信息,包括文件名。
  11. multiPart->append(filePart);:将文件数据部分添加到QHttpMultiPart对象中。
  12. QNetworkReply *reply = manager->post(request, multiPart);:使用QNetworkAccessManager对象发送POST请求,将QHttpMultiPart对象作为请求体,并获取响应。
  13. connect(reply, &QNetworkReply::finished, this, [=]() {...});:连接QNetworkReply对象的finished信号,当上传完成时,执行Lambda函数处理响应数据。

在Lambda函数中,首先检查上传是否成功,如果成功,读取响应数据并进行处理;如果失败,输出错误信息。最后清理资源,删除replymultiPartfile对象。

这段代码实现了基本的文件上传功能,通过Qt的网络模块发送HTTP请求,并将文件作为请求体上传到服务器。

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

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

相关文章

Vue3-属性绑定、定时任务

1.Vue3-属性绑定 2.定时任务 1.Vue3-属性绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.gl…

android开源投屏工具scrcpy简介

目录 一&#xff0c;初识scrcpy 1.1 scrcpy介绍 1.2 scrcpy特点 二&#xff0c;scrcpy指令说明 2.1 画面设置 2.1.1 缩小分辨率 2.1.2 修改画面比特率 2.1.3 限制画面帧率 2.1.4 画面裁剪 2.1.5 锁定屏幕朝向 2.2 屏幕录制 2.3 连接方式 2.3.1 无线 2.3.2 多设备…

云计算:掌控未来,一触即发!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

Systrace学习笔记

Systrace学习笔记 1.Systrace快捷键2.线程状态3.CPU info4.图形化4.1 Frames帧4.2 用户活动4.3 CPU活动4.4 系统事件 5. SystemServer5.1 SystemServer简介5.2 窗口动画5.3 AMS(ActivityManagerService)5.4 WMS(WindowMagerService)5.5 ServiceThread5.6 HandlerThread 6. Surf…

软考-网络安全体系与网络安全模型

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 网络安全体系相关安全模型 BLP机密性模型 BLP&#xff08;Biba-格雷泽-麦克拉伦&#x…

安装Elasticsearch步骤(包含遇到的问题及解决方案)

注&#xff1a;笔者是在centos云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch 3.启动Elasticsearch 非常容易出问题 第一次运行时&#xff0c;可能出现如下错误&#xff1a; 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自…

【数据仓库】hadoop生态圈与数据仓库

文章目录 1.大数据定义2. Hadoop与数据仓库3. 关系数据库的可扩展性瓶颈4. CAP理论5. Hadoop数据仓库工具5.1. RDS和TDS5.2. 抽取过程5.3. 转换与装载过程5.4. 过程管理和自动化调度5.5&#xff0e;数据目录&#xff08;或者称为元数据管理&#xff09;5.6&#xff0e;查询引擎…

ELK + Filebeat 分布式日志管理平台部署

ELK Filebeat 分布式日志管理平台部署 1、前言1.1日志分析的作用1.2需要收集的日志1.3完整日志系统的基本特征 2、ELK概述2.1ELK简介2.2为什么要用ELK?2.3ELK的组件 3、ELK组件详解3.1Logstash3.1.1简介3.1.2Logstash命令常用选项3.1.3Logstash 的输入和输出流3.1.4Logstash配…

Tengine 边缘AI计算框架移植RV1126(包括opencv的交叉编译)

目录 1.编译opencv 2.拷贝SDK源码到虚拟机 3. 拉取TIM-VX代码 4.拉取Tengine源码并配置 1.编译opencv 编译opencv是为了&#xff0c;在编译Tengine时指定OpenCVConfig.cmake,以便寻找特定的opencv动态库 01.从github拉取opencv源代码 git clone -b 4.5.5 https://github.co…

unity 浏览器插件【embedded browser(原zfbrowser)】简单教程,使unity支持web h5页面,附软件下载链接

一 简介 这是个在项目中使用了很久的浏览器插件。 很负责任的说这是在pc平台上最好用的浏览器插件 商业付费价格78刀&#xff0c;相比3d webview等插件动不动就178、368的价格就显得很良心 最新版下载链接&#xff08;请勿商用&#xff09; 1.1 功能概述 基本和普通浏览器无…

基于Scrapyd与Gerapy部署scrapy爬虫方案【可用于分布式爬虫部署】

scrapyd部署爬虫 Scrapyd 是一个基于 Scrapy 的开源项目&#xff0c;它提供了一个简单的方式来部署、运行和监控 Scrapy 爬虫。它是一个用于集成 Scrapy 爬虫到分布式架构中的工具&#xff0c;允许您在分布式环境中运行爬虫&#xff0c;并提供了一组 Web API&#xff0c;用于管…

软考高级系统架构设计师系列之:数学与经济管理

软考高级系统架构设计师系列之:数学与经济管理 一、数学与经济管理二、图论应用-最小生成树三、图论应用-最短路径四、图论应用-网络与最大流量五、运筹方法-线性规划六、运筹方法-动态规划七、运筹方法-转移矩阵八、运筹方法-排队论九、运筹方法-决策-不确定决策十、运筹方法…

携手北大医学部、哈佛BCH顶尖平台,飞鹤全面启动脑发育战略

10月17日&#xff0c;“专研大脑营养 聪明中国宝宝”飞鹤脑发育战略发布会在北京举办。会上&#xff0c;中国飞鹤宣布启动脑发育战略。诺奖得主迈克尔莱维特、中国工程院院士朱蓓薇、中国工程院院士陈卫、北京大学神经科学研究所副所长邢国刚等海内外专家齐聚&#xff0c;共同探…

Redis数据结构之listpack

前言 当数据量较小时&#xff0c;Redis 会优先考虑用 ziplist 来存储 hash、list、zset&#xff0c;这么做可以有效的节省内存空间&#xff0c;因为 ziplist 是一块连续的内存空间&#xff0c;它采用一种紧凑的方式来存储元素。但是它也有缺点&#xff0c;比如查找的时间复杂度…

Unity2023, Unity2022, Unity2021的性能对比(帧率)

最近由于需要用到Unity最新版的一些功能&#xff0c;比如Spline&#xff0c;比如Foward渲染&#xff0c;新项目用了Unity2022.3.5版本&#xff0c;但是出包之后&#xff0c;感觉帧率很低。本着好奇的态度&#xff0c;专门写了一个测试场景&#xff0c;分别在Unity2023.1.15&…

激光跟踪仪在风电行业中的应用

随着全球能源行业重点从化石能源向可再生能源转移&#xff0c;风电行业逐渐成为我国能源供应体系的重要分支&#xff0c;相关的风电检测设备需求量急剧增加。 风电设备主要特点是“重、大”&#xff0c;在过去&#xff0c;主要使用大型卡尺、两点式仪表、专用模板等量具对重要尺…

PS运行中缺失d3dcompiler_47.dll问题的5个有效修复方法总结

在使用ps作图的时候&#xff0c;我们有时会遇到一些问题&#xff0c;其中之一就是“PS运行中缺失d3dcompiler_47.dll”的问题。这个问题可能会导致PS无法正常运行&#xff0c;“d3dcompiler_47.dll”。这是一个动态链接库文件&#xff0c;它是DirectX的一部分&#xff0c;主要负…

Docker仓库harbor私服搭建

Harbor和Registry都是Docker的镜像仓库&#xff0c;但是Harbor作为更多企业的选择&#xff0c;是因为相比较于Regisrty来说&#xff0c;它具有很多的优势。 提供分层传输机制&#xff0c;优化网络传输 Docker镜像是是分层的&#xff0c;而如果每次传输都使用全量文件(所以用FT…

Kubernetes 基础

Kubernetes是什么 K8S由google的Borg系统(博格系统&#xff0c;google内部使用的大规模容器编排工具)作为原型&#xff0c; 后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会&#xff08;CNCF&#xff09;于2015年12月成立&#xff0c;隶属于Linux基金会…

Lock锁的使用方法(一)

public class LockTest01 {private Lock lock new ReentrantLock();public static void main(String[] args) throws InterruptedException {/*** Lock锁 获取锁和释放锁 需要开发人员自己定义*/LockTest01 lockTest01 new LockTest01();lockTest01.print();Thread.sleep(500…