【QT 网络云盘客户端】——获取用户文件列表信息

news2024/9/29 15:28:31

目录

1.获取用户文件列表信息分析

2.设置图标属性

3.向服务器获取文件的数量

 4.向服务器获取文件信息列表

4.显示图标


1.获取用户文件列表信息分析

1.将QListWidget设置为图标模式

2. 当我们点击"按下载量升序","按下载量降序",“更新菜单选项 会调用 getFileCount 接口获取文件数量,如果文件数量大于0,则会getFileList获取所有文件的信息。

3.将获取的所有的文件信息保存到 QList<FileInfo*> m_fileInfoList;(FileInfo是一个自定义文件结构体)

3.调用 refreshFileList 接口 将 m_fileInfoList中 中的所有文件信息以 图标形式 显示到 QWidgetList窗口上。( 图标 包含 图片和文件名

    
    //设置菜单选项的槽函数
    connect(m_downloadAscAction,&QAction::triggered,this,[=]{
             // qDebug()<<"按下载量降序";
              getFileCount(Desc);
    });


    connect(m_downloadDescAction,&QAction::triggered,this,[=]{
            //  qDebug()<<"按下载量升序";
               getFileCount(Asc);
    });

    connect(m_refreshAction,&QAction::triggered,this,[=]{
            getFileCount(Normal);
            qDebug()<<"更新";
    });

   getFileCount(MyFileDisplay cmd);//获取文件的数量
   getFileList(MyFileDisplay cmd);//获取用户的文件信息列表
   refreshFileList();//显示图标

2.设置图标属性

    //设置图标模式
    ui->listWidget->setViewMode(QListView::IconMode);
    //设置在图标的图片的大小
    ui->listWidget->setIconSize(QSize(80,80));
    //设置图标的 布局的大小
    ui->listWidget->setGridSize(QSize(120,200));


    //自适应布局,需要将窗口进行布局才能生效
    ui->listWidget->setResizeMode(QListView::Adjust);
    //设置图标拖动状态,QListView::Static表示不可以拖动
    ui->listWidget->setMovement(QListView::Static);

3.向服务器获取文件的数量

客户端 会先调用 getFileCount 发送一个http请求 向服务器获取用户的文件数量 ,http请求如下:

POST http://119.23.41.13:80/myfiles?cmd=count HTTP/1.1
Content-Type: application/json

{
    "token": "7e4b94f141b8bc7680fac2fa7dcdddf3",
    "user": "zhangsan"
}

服务器返回的 http响应:

HTTP/1.1 200 OK

{
	"num":	"7",  //文件的数量
	"code":	"110" //获取失败为 111
}

请求流程: 

代码实现: 

​//Normal正常显示,Asc 按下载量升序显示,Desc按下载量降序显示
enum MyFileDisplay { Normal, Asc, Desc};

//获取文件的数量
void myfile::getFileCount(MyFileDisplay cmd)
{
    /*
         1.设置http请求并发送http请求
         2.获取响应的正文数据,并解析"code",和"num"
         3.如果code为"110","num"不为0,则调用getFileList获取文件信息列表        
    */
    //封装http请求
    QNetworkRequest request;
    //从配置文件中获取到ip地址和port端口号
    QString ip=Common::getInstant()->getConfValue("web_server","ip");
    QString port=Common::getInstant()->getConfValue("web_server","port");

     QString url = QString("http://%1:%2/myfiles?cmd=count").arg(ip).arg(port);

 
    request.setUrl(QUrl(url));

    //设置文件类型
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    //将data数据以QJson的格式发送给服务器

    QJsonObject object;
    object.insert("user", m_logininfo->user());
    object.insert("token", m_logininfo->token());

    QJsonDocument doc(object);
    QByteArray data=doc.toJson();
    //发送请求
   // qDebug()<<data;
    QNetworkReply* rely=m_manager->post(request,data);

    connect(rely,&QNetworkReply::readyRead,this,[=]{
        //响应到达,读取所有的数据
        QByteArray s=rely->readAll();
         qDebug() << "服务器返回数据:" << QString(s);
         //将s数据转换为Json对象
         QJsonParseError err;
         QJsonDocument document=QJsonDocument::fromJson(s,&err);

        if(err.error!=QJsonParseError::NoError){
            qDebug()<<"QJson格式错误";
            return;
        }
        //将QJson字符串转换为QJson对象
        QJsonObject object1;
        object1=document.object();

        //获取状态码
        QString value1=object1["code"].toString();
        if(value1=="110"){
            //获取列表成功,获取文件列表
            myfileCount=object1["num"].toString().toInt();
            if(myfileCount>0){
                //文件列表数量大于0
                getFileList(cmd);//请求文件列表
            }
        }
        if(value1=="111"){
            //获取失败
            qDebug()<<"获取文件失败";
        }
    });
}

 4.向服务器获取文件信息列表

当文件数量大于0的时候,则会调用 getFileList 接口 发送一个http请求 向服务器请求 用户的 文件信息列表,http请求如下:

POST http://119.23.41.13:80/myfiles?cmd=normal HTTP/1.1
Content-Type: application/json
Content-Length: 108

{
    "count": 7, //请求的文件数量
    "start": 0, //从哪个文件信息开始获取
    "token": "7e4b94f141b8bc7680fac2fa7dcdddf3",
    "user": "zhangsan" 
}

服务器发送回来的响应:

HTTP/1.1 200 OK

{
	"files":	[{
			"user":	"zhangsan",
			"md5":	"b6bb728a0016b6327a6b549ea1f719d1",
			"create_time":	"2023-07-27 20:55:15",
			"file_name":	"test1.json",
			"share_status":	1,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTCaTOAdjiBAAABBfJuwvA57.json",
			"size":	261,
			"type":	"json"
		}, {
			"user":	"zhangsan",
			"md5":	"05aee6833498afae803c103488838616",
			"create_time":	"2023-07-28 01:27:56",
			"file_name":	"2023包装印刷工艺实验_ 综合性实验1.doc",
			"share_status":	1,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTCafaAGABwAAm0Qrbrn4w371.doc",
			"size":	638464,
			"type":	"doc"
		}, {
			"user":	"zhangsan",
			"md5":	"e9f32a97b8bde8cdbda5c2481dc77e6f",
			"create_time":	"2023-07-28 04:45:31",
			"file_name":	"沈家鹏+202022210218+包装工艺实验报告.doc",
			"share_status":	1,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTC12uAQEQVAFojXojlUxs887.doc",
			"size":	5929984,
			"type":	"doc"
		}, {
			"user":	"zhangsan",
			"md5":	"0a4194984ac702483c500d7e216ef655",
			"create_time":	"2023-07-28 18:36:42",
			"file_name":	"沈家鹏+202022210218+包装工艺实验.pdf",
			"share_status":	0,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmjqAfVaIAAtEPBMxG-A084.pdf",
			"size":	742876,
			"type":	"pdf"
		}, {
			"user":	"zhangsan",
			"md5":	"697bed673b8061471b3d04144fa4050e",
			"create_time":	"2023-07-28 18:36:51",
			"file_name":	"沈家鹏+202022210218+包装机械工厂参观实验报告.doc",
			"share_status":	0,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkOAN2_EADNSzTgsyJg890.doc",
			"size":	3376128,
			"type":	"doc"
		}, {
			"user":	"zhangsan",
			"md5":	"2a96c1401c1409dd24f8cc6996462a1e",
			"create_time":	"2023-07-28 18:36:52",
			"file_name":	"沈家鹏+202022210218+综合实验1.doc",
			"share_status":	0,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkSANiWXAACtJYuY4UE605.doc",
			"size":	44544,
			"type":	"doc"
		}, {
			"user":	"zhangsan",
			"md5":	"6f9e42afb2db2f92e7ba53b4c58d45b1",
			"create_time":	"2023-07-28 18:36:52",
			"file_name":	"沈家鹏+202022210218+综合性实验2.doc",
			"share_status":	0,
			"pv":	0,
			"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGTDmkSAXQw4AAFJKPLgCM4027.doc",
			"size":	84480,
			"type":	"doc"
		}]
}

文件信息列表Json包是一个Json对象。它只包含一个key-value结构,其中key是 “files”,Value是一个Json数组,数组中包含多个Json对象,每一个Json对象中包含着每一个文件的信息,包括:

"user":	"sjp",   //文件的上传的用户
"md5":	"8274425de767b30b2fff1124ab54abb5", //用来唯一标识文件
"create_time":	"2023-07-18 18:13:43", //上传时间
"file_name":	"111.rtf", //文件名
"share_status":	0,         //分享状态
"pv":	1,                 //下载量
"url":	"http://172.31.39.20:80/group1/M00/00/00/rB8nFGS2ZdeAHmamAAAAB8uzquY970.rtf",
"size":	7,                 //文件大小
"type":	"rtf"              //文件类型

代码实现:

struct FileInfo
{
    QString user;           //用户名
    QString md5;            //md5
    QString createTime;     //上传时间
    QString fileName;       //文件名称
    int shareStatus;        //共享状态, 0为没有共享, 1为共享
    int pv;                 //文件下载量,下载一次加1
    QString url;            //文件url
    int size;               //文件大小
    QString type;           //文件类型
};


 QList<FileInfo*> m_fileInfoList;//存储着所有的文件列表的信息


//获取文件信息列表
void myfile::getFileList(MyFileDisplay cmd)
{
    /*
        1.发送http请求获取文件信息列表
        2.获取成功,需要先清除QListWidget中的item和 m_fileInfoList
        3.将新的文件信息列表添加到m_fileInfoList 和QListWidget中。
     */
    QString strCmd;
    if (cmd == MyFileDisplay::Normal) {
        strCmd = "normal";
    } else if (cmd == MyFileDisplay::Asc) {
        strCmd = "pvasc";
    } else if (cmd == MyFileDisplay::Desc) {
        strCmd = "pvdesc";
    }
    //封装http请求
    QNetworkRequest request;
    //从配置文件中获取到ip地址和port端口号
    QString ip=Common::getInstant()->getConfValue("web_server","ip");
    QString port=Common::getInstant()->getConfValue("web_server","port");

    //http://192.168.52.139/myfiles?cmd=normal
    //http://192.168.52.139/myfiles?cmd=asc
    //http://192.168.52.139/myfiles?cmd=pvasc
    QString url = QString("http://%1:%2/myfiles?cmd=%3").arg(ip).arg(port).arg(strCmd);
    request.setUrl(QUrl(url));

    //设置数据类型
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    //将data数据以QJson的格式发送给服务器

    QJsonObject object;
    object.insert("user", m_logininfo->user());
    object.insert("token", m_logininfo->token());
    object.insert("start", 0);
    object.insert("count", myfileCount);

    QJsonDocument doc(object);
    QByteArray data=doc.toJson();
    //发送请求
    QNetworkReply* rely=m_manager->post(request,data);
    connect(rely,&QNetworkReply::readyRead,this,[=]{
        //响应到达,读取所有的数据
        
        QByteArray s=rely->readAll();
        clearFileList();//清空文件列表
        clearFileItem();//
         //将文件列表信息解析到m_fileInfoList中
        AnalyJsonData::getFileList(s,m_fileInfoList);
        refreshFileList();
        rely->deleteLater();
    });
}

//AnalyJsonData::getFileList(s,m_fileInfoList)接口
//是将响应正文的数据解析到m_fileInfoList中

4.显示图标

获取到所有的文件信息后,就需要将 m_fileInfoList 中的文件以图标的形式显示到 QListWidget 上.


//显示文件列表到QListWidget
void myfile::refreshFileList()
{
    /*
     1.获取每一个文件信息
     2.根据文件类型显示不同的图标
     3.将QListWidgetItem添加到QWidget中
     */
    for(int i=0;i<m_fileInfoList.count();i++)
    {
       FileInfo* info= m_fileInfoList[i];
       //将图标设置进QListWidget中
        QIcon icon(":/res/txt.png");
       if(info->type=="jpg"||info->type=="png")
       {
           icon.addFile(":/res/jpg.png");
       }else if(info->type=="pdf")
       {
           icon.addFile(":/res/pdf.png");
       }

       QListWidgetItem* item1=new QListWidgetItem(icon,info->fileName);
       item1->setTextAlignment(Qt::AlignLeft);
       ui->listWidget->addItem(item1);
    } 
    //最后在添加一个上传文件的item到QListWidgetItem
    QIcon icon(":/res/111111.png");
    QListWidgetItem* item1=new QListWidgetItem(icon,"上传文件");
    ui->listWidget->addItem(item1);
}

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

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

相关文章

3、HAproxy高级配置

基于cookie的会话保持 在 HAProxy 中&#xff0c;可以通过使用 cookie 配置来实现基于 Cookie 的会话保持。cookie 配置用于配置与会话保持相关的选项&#xff0c;允许您定义要在HTTP响应中插入或重写的Cookie以及其他与Cookie会话保持相关的参数。 以下是一些常用的 cookie 配…

已解决 IDEA Maven 项目中 “Could not find artifact“ 问题的常见情况和解决方案

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

QT第四讲

思维导图 基于QT的网络聊天室 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList…

Windows使用Notepad++编辑Linux服务器的文件

&#x1f680; Windows使用Notepad编辑Linux服务器的文件 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介…

<el-date-picker>组件选择开始时间,结束时间自动延长30min

背景&#xff1a;选择开始时间&#xff0c;结束时间自动增加30分钟&#xff0c;结束时间也可重新选择&#xff0c;如图&#xff1a; <el-form-item label"预约开始时间" prop"value1"><el-date-pickersize"large"v-model"ruleForm…

Vue2 第三节 数据代理和事件处理

1.Object.defineProperty 方法 2.数据代理 3.Vue中的数据代理 4.事件的基本使用 5.事件修饰符 6.键盘事件 一.Object.defineProperty 方法 &#xff08;1&#xff09;学习Object.defineProperty为下一节数据代理做准备 &#xff08;2&#xff09;更加高级的给对象添加属…

两个csv进行根据相同字段进行合并

源文件&#xff0c;第一列&#xff0c;编号0 目标文件&#xff0c; 编号3 根据社区名称进行匹配&#xff0c;然后将第一个csv文件的经纬度添加到第二个文件中。 import csvsource r"D:\000datasets\链家房价数据\2020去重后社区名称地理编码.csv" target r"…

TAURI桌面平台制作应用程序工具包初体验

原文&#xff1a;https://tauri.app/zh-cn/v1/guides/getting-started/setup/html-css-js 前提&#xff1a;https://tauri.app/zh-cn/v1/guides/getting-started/prerequisites 步骤1&#xff1a; 在 D:\MyStudy\TauriDemo 文件夹下新建 ui 文件夹&#xff0c;在 ui 文件夹中…

QChart笔记5:Polar Chart极坐标用法

QChart还有专门画极坐标的类QPolarChart&#xff0c;它的界面是一个圆盘。 #include <QApplication> #include <QDebug> #include <QtCharts/QScatterSeries> #include <QtCharts/QLineSeries> #include <QtCharts/QPolarChart> #include <Q…

HR:“抱歉不合适!”,竟是没有满足这项硬性要求?

兼容性测试主要通过人工或自动化的方式&#xff0c;在需要覆盖的终端设备上进行功能用例执行&#xff0c;查看软件性能、稳定性等是否正常。 对于需要覆盖的终端设备&#xff0c;大型互联网公司&#xff0c;像 BAT&#xff0c;基本都有自己的测试实验室&#xff0c;拥有大量终…

资深测试总结,自动化测试-ddt数据驱动yaml文件实战(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 ddt 驱动 yaml/ym…

matplotlib从起点出发(5)_Tutorial_5_sytleSheets

1 使用样式表和rcParams自定义matplotlib 以下是自定义matplotlib的属性和默认样式的提示。 有三种方式来自定义matplotlib: 在运行时设置rcParams&#xff1b;使用样式表&#xff1b;改写matplotlibrc文件。 在运行时设置rcParams优先于样式表&#xff0c;样式表优先于matp…

用户分享|当我升级了 CloudQuery 2.2.0 后......

导读&#xff1a; 7 月 13 日&#xff0c;CloudQuery&#xff08;下文简称 CQ&#xff09; 2.2.0 版本正式发布&#xff0c;在看到官方文档对新版本的介绍后&#xff0c;马上进行安装测试。本文主要为大家介绍从 CQ 1.4.2 升级到 2.2 的考量因素、测试情况&#xff0c;分享一些…

SCO 267,1656261-09-4,是一种变构GPR40全激动剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu 产品结构式&#xff1a; ​ 产品规格&#xff1a; SCO-267 1.CAS号&#xff1a;1656261-09-4 2.分子式&#xff1a;C36H46N4O5 3.分子量&#xff1a;614.79 4.包装规格&#xff1a;1g、5g、10g&#xff0c;包装灵活 5.外观颜…

【图像分类】CNN + Transformer 结合系列.1

介绍三篇结合使用CNNTransformer进行学习的论文&#xff1a;CvT&#xff08;ICCV2021&#xff09;&#xff0c;Mobile-Former&#xff08;CVPR2022&#xff09;&#xff0c;SegNetr&#xff08;arXiv2307&#xff09;. CvT: Introducing Convolutions to Vision Transformers, …

ping命令

上图为IA ping B的过程&#xff0c;在此过程中&#xff1a; 包传送在x位置时&#xff0c;DestMacB左&#xff0c;SourceMacMac_A&#xff0c;Dest ipIp_B,Src_ipIp_A包传送在y位置时&#xff0c;DestMacB右&#xff0c;SourceMacB左 &#xff0c; Dest ipIp_B,Src_ipIp_A MAC…

想学Python高级编程?这个技巧你不能错过!

前言 熟悉Python的朋友都知道&#xff0c;Python有一个让人又爱又恨的特点&#xff1a;数据类型的定义和使用非常的灵活。 在编写一个简易脚本的时候&#xff0c;这个特点让编程难度显著下降&#xff1b;但如果你需要编写一个大型程序&#xff0c;而且还需要多人协作时&#…

电磁波定义、特性以及信道相关知识

文章目录 前言一、电磁波的定义、特性、波谱1、电磁波的特性2、电磁波谱的划分及用途 二、地球大气层的结构三、电磁波的传播方式1、地波&#xff08;ground-wave&#xff09;2、天波&#xff08;sky-wave&#xff09;3、视线传播&#xff08;line-of-sight&#xff09;①、相关…

Spread for Winform 16.2.20231.0 (SP2) Crack

Spread for Winform 16.2.20231.0 (SP2)发布。此版本包含针对客户报告的问题的重要修复&#xff1a; 安装版本 16 后&#xff0c;FarPoint.Localization.dll 将丢失。 将数据绑定到 Spread 时会出现 InvalidOperationException。 通过 Spread Designer 设置的上标将不会保留。…

视频加密的两种常见的方式数字版权管理和加密算法与应用

视频加密的两种常见的方式数字版权管理和加密算法与应用实例&#xff1a; 数字版权管理&#xff08;DRM&#xff09;对视频做加密处理。 数字版权管理是指使用数字版权管理技术对视频内容进行加密和保护。这可以通过给视频文件添加特殊的加密标识符、许可证或者限制访问的方式…