搭建文件服务器并使用Qt实现文件上传和下载(带账号和密码)

文章目录

  • 0 背景
  • 1 搭建文件服务器
  • 2 代码实现文件上传和下载
    • 2.1 在pro文件中添加网络支持
    • 2.2 创建网络管理类
    • 2.3 文件上传
    • 2.4 文件下载
  • 3 扩展(其他方法实现文件上传和下载)
    • 3.1 python
    • 3.2 npm
    • 3.3 ftp服务器
  • 4 完整的代码

0 背景

因为需要使程序具备在远程软件在服务器的上传和下载文件的功能,所以研究了一下怎么实现。

在这里插入图片描述

在这里插入图片描述

1 搭建文件服务器

常用的文件服务器有apache、npm、ftp,这里选择的apache2,因为搭建和使用都比较方便。

1,安装

sudo apt update
sudo apt install apache2

2,创建身份验证用户::

# 新增用户
htpasswd -c /etc/apache2/webdav.password 【webdav用户名】# 更改密码
htpasswd -b /etc/apache2/webdav.password 【这里换成你要登录webdav的名字】 # 删除用户
htpasswd -D htpasswd.user Jack

3,编写配置文件

vim /etc/apache2/sites-available/000-default.conf

修改为如下内容:

<VirtualHost *:9022># The ServerName directive sets the request scheme, hostname and port that# the server uses to identify itself. This is used when creating# redirection URLs. In the context of virtual hosts, the ServerName# specifies what hostname must appear in the request's Host: header to# match this virtual host. For the default virtual host (this file) this# value is not decisive as it is used as a last resort host regardless.# However, you must set it for any further virtual host explicitly.#ServerName www.example.comServerAdmin webmaster@localhostDocumentRoot /var/www/html<Directory  "/var/www/html">Dav onOptions Indexes FollowSymLinks MultiViewsAllowOverride AllRequire all grantedallow from all
</Directory>DavLockDB "/home/apache2/data/DavLock"
# 配置一个虚拟目录
Alias /webdav /home/apache2/data<Directory /home/apache2/data>
#开启Dav支持Dav On
# 禁止浏览器显示目录,将-Indexes前的减号去掉为允许显示(当index.html不存在时)Options Indexes
# 认证方式,虽然这种方式不安全但可以快速架设成功我们需要的服务        AuthType Basic# 这里的名字随意写        AuthName "WebDAV"# 非常关键的用户管理文件       AuthUserFile /etc/apache2/webdav.passwordAuthBasicProvider file# 允许userfile.pass里的所有用户访问       Require valid-userAllowOverride All
</Directory></VirtualHost>

授予文件访问权限:

sudo chmod 775 /var/www

4,启动并使其自动运行:

sudo systemctl start apache2
sudo systemctl status apache2
sudo systemctl enable apache2

5,其他指令

# 重启 Apache(完全停止并重新启动 Apache 服务。这适用于那些进行了重大更改并需要完全重启服务的情况):
sudo systemctl restart apache2# systemctl reload 只是重新加载 Apache 的配置文件,而不会中断服务的运行:
sudo systemctl reload apache2

2 代码实现文件上传和下载

2.1 在pro文件中添加网络支持

QT += network

2.2 创建网络管理类

# .h文件中添加:private://发送网络请求和接受应答QNetworkAccessManager* m_networkAccessManager;# .cpp文件中添加:m_networkAccessManager = new QNetworkAccessManager();

2.3 文件上传

1,功能函数;

//上传文件
void MainInterface::uploadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath)
{// QFile file(sourceFilePath);m_readFile.setFileName(sourceFilePath);if (m_readFile.open(QIODevice::ReadOnly)){QFileInfo fileInfo(sourceFilePath);QString fileName = fileInfo.fileName();//如果目的文件名,使用原文件名if(purposeFilePath == ""){purposeFilePath = fileName;}QString urlText = QString("http://192.168.0.211:9022/webdav/") + purposeFilePath;qDebug()<<urlText;QUrl url(urlText);// 设置用户名和密码凭据QString username = "uploaduser2";QString password = "test";url.setUserName(username);url.setPassword(password);m_httpRequest.setUrl(url);m_networkAccessManager->put(m_httpRequest, &m_readFile);}else{qDebug()<<"打开文件失败";}}

2,方法调用;

    //文件上传QString sourceFilePath = QString("E:/s1.xlsx");QString purposeFilePath = "";uploadFileFromHttpServerApacheWebdav(sourceFilePath, purposeFilePath);

2.4 文件下载

这里下载使用的是post方法,而没有使用get。

1,功能函数;

//从服务器上下载文件
void MainInterface::downloadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath){QString urlText = QString("http://192.168.0.211:9022/webdav/") + sourceFilePath;QUrl url(urlText);// 设置用户名和密码凭据QString username = "uploaduser2";QString password = "test";url.setUserName(username);url.setPassword(password);m_httpRequest.setUrl(url);QString saveFilePath = QCoreApplication::applicationDirPath() + QString("/") ;//末尾无斜杠m_purposeSaveFilePath = saveFilePath  + purposeFilePath;m_isReceiveFile = true;m_networkAccessManager->get(m_httpRequest);}//处理所有post请求connect(m_networkAccessManager, &QNetworkAccessManager::finished,this, [&](QNetworkReply *reply){if (reply->error()) {qDebug() << "Download error:" << reply->errorString();} else {//接收并下载文件if(m_isReceiveFile == true){m_isReceiveFile = false;// 处理获取到的文件内容QByteArray fileData = reply->readAll();qDebug() << "写入下载的数据:"<<m_purposeSaveFilePath;QFile file(m_purposeSaveFilePath);//QFile file(purposeFilePath);if (file.open(QIODevice::WriteOnly)) {file.write(fileData);file.close();}}else{QVariant data = reply->readAll();qDebug()<<data.toString();}}reply->deleteLater();});

2,方法调用;

    QString sourceFilePath = "s5.xlsx";QString purposeFilePath = "data/s5.xlsx";downloadFileFromHttpServerApacheWebdav(sourceFilePath, purposeFilePath);

3 扩展(其他方法实现文件上传和下载)

3.1 python

下载和安装python3,然后使用如下指令开启服务器

python -m http.server -b 127.0.0.1 

3.2 npm

1,安装
执行代码:

 npm install http-server -g

-g 参数代表全局安装一定不要省略,全局安装后,全局都可以使用

2,在需要共享的文件夹下,运行

http-server

3.3 ftp服务器

1,安装(https://www.myfreax.com/how-to-setup-ftp-server-with-vsftpd-on-debian-11/)

sudo apt update
sudo apt install vsftpd
sudo systemctl status vsftpd

2,新建ftp登录账户

# 创建一个帐户
sudo adduser ftpuser# 为了让用户能够访问FTP服务器,你需要将其添加到FTP用户组中。输入以下命令:sudo usermod -a -G ftp ftpuser

3,修改配置文件

修改/etc/shells

sudo vim /etc/shells#写入以下这行,否则ftpuser无法登录
/usr/sbin/nologin

修改内容:

# 启用上传
write_enable=YES#限制ftp用户只能待在自己的家目录,不能跳到其他目录
chroot_local_user=YES       
allow_writeable_chroot=YES   #不加入这条会导致ftp用户对家目录没有写入权限chroot_local_user=YES        #限制ftp用户只能待在自己的家目录,不能跳到其他目录
userlist_enable=YES          #使用userlist限制可以登录ftp的账户
userlist_deny=NO             #这里是NO则userlist是白名单,YES就是黑名单

4,重启vsftpd服务

sudo systemctl restart vsftpd
systemctl start vsftpd.service
sudo systemctl status vsftpd

4 完整的代码

MainInterface.h

#ifndef MAIN_INTERFACE_H
#define MAIN_INTERFACE_H#include <QMainWindow>#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>QT_BEGIN_NAMESPACE
namespace Ui {
class MainInterface;
}
QT_END_NAMESPACEclass MainInterface : public QMainWindow
{Q_OBJECTpublic:MainInterface(QWidget *parent = nullptr);~MainInterface();private:Ui::MainInterface *ui;private://发送网络请求和接受应答QNetworkAccessManager* m_networkAccessManager;//是否是接收文件bool m_isReceiveFile = false;//目的存储路径QString m_purposeSaveFilePath;//请求QNetworkRequest m_httpRequest;//文件下载QFile m_readFile;/*** @brief downloadFileFromHttpServerApacheWebdav:从apache2服务器上下载文件(get)* @param sourceFilePath:源文件路径(最前面不带/,)* @param purposeFilePath:目的文件路径(最前面不带/,最前面包含了运行文件的路径)*/void downloadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath);/*** @brief 上传文件到服务器上(put)* @param sourceFilePath* @param purposeFilePath*/void uploadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath);
};
#endif // MAIN_INTERFACE_H

MainInterface.cpp

#include "main_interface.h"
#include "ui_main_interface.h"#include <QDebug>#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QObject>
#include <QFile>
#include <QFileInfo>MainInterface::MainInterface(QWidget *parent): QMainWindow(parent), ui(new Ui::MainInterface)
{ui->setupUi(this);// qDebug() << QSslSocket::supportsSsl()//是否支持,不支持就说明没有openSSL//          << QSslSocket::sslLibraryBuildVersionString()//运行时需要的版本//          << QSslSocket::sslLibraryVersionString();//可用的版本m_networkAccessManager = new QNetworkAccessManager();//处理所有post请求connect(m_networkAccessManager, &QNetworkAccessManager::finished,this, [&](QNetworkReply *reply){if (reply->error()) {qDebug() << "Download error:" << reply->errorString();} else {//接收并下载文件if(m_isReceiveFile == true){m_isReceiveFile = false;// 处理获取到的文件内容QByteArray fileData = reply->readAll();qDebug() << "写入下载的数据:"<<m_purposeSaveFilePath;QFile file(m_purposeSaveFilePath);//QFile file(purposeFilePath);if (file.open(QIODevice::WriteOnly)) {file.write(fileData);file.close();}}else{QVariant data = reply->readAll();qDebug()<<data.toString();}}reply->deleteLater();});//文件下载// QString sourceFilePath = "s5_ExamineExamOne_1721294100.xlsx";// QString purposeFilePath = "data/s5_ExamineExamOne_1721294100.xlsx";// downloadFileFromHttpServerApacheWebdav(sourceFilePath, purposeFilePath);//文件上传QString sourceFilePath = QString("E:/s1.xlsx");QString purposeFilePath = "";uploadFileFromHttpServerApacheWebdav(sourceFilePath, purposeFilePath);}MainInterface::~MainInterface()
{delete ui;
}//从服务器上下载文件
void MainInterface::downloadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath){QString urlText = QString("http://192.168.0.211:9022/webdav/") + sourceFilePath;QUrl url(urlText);// 设置用户名和密码凭据QString username = "uploaduser2";QString password = "test";url.setUserName(username);url.setPassword(password);m_httpRequest.setUrl(url);QString saveFilePath = QCoreApplication::applicationDirPath() + QString("/") ;//末尾无斜杠m_purposeSaveFilePath = saveFilePath  + purposeFilePath;m_isReceiveFile = true;m_networkAccessManager->get(m_httpRequest);}//上传文件
void MainInterface::uploadFileFromHttpServerApacheWebdav(QString sourceFilePath, QString purposeFilePath)
{// QFile file(sourceFilePath);m_readFile.setFileName(sourceFilePath);if (m_readFile.open(QIODevice::ReadOnly)){QFileInfo fileInfo(sourceFilePath);QString fileName = fileInfo.fileName();//如果目的文件名,使用原文件名if(purposeFilePath == ""){purposeFilePath = fileName;}QString urlText = QString("http://192.168.0.211:9022/webdav/") + purposeFilePath;qDebug()<<urlText;QUrl url(urlText);// 设置用户名和密码凭据QString username = "uploaduser2";QString password = "test";url.setUserName(username);url.setPassword(password);m_httpRequest.setUrl(url);m_networkAccessManager->put(m_httpRequest, &m_readFile);}else{qDebug()<<"打开文件失败";}}

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

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

相关文章

社交新零售模式下“2+1 链动模式 S2B2C 商城小程序”的创新实践与发展策略

摘要&#xff1a;随着实体商业与社交网络深度融合&#xff0c;社交新零售蓬勃兴起&#xff0c;“21 链动模式 S2B2C 商城小程序”作为其中创新典范&#xff0c;融合独特激励机制与数字化运营优势&#xff0c;重塑零售生态。本文剖析该模式架构、运作逻辑&#xff0c;探讨其在私…

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大&#xff0c;服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱&#xff08;HWE9000V2&#xff09;作为一款高性能的服务器设备&#xff0c;其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…

Css—实现3D导航栏

一、背景 最近在其他的网页中看到了一个很有趣的3d效果&#xff0c;这个效果就是使用css3中的3D转换实现的&#xff0c;所以今天的内容就是3D的导航栏效果。那么话不多说&#xff0c;直接开始主要内容的讲解。 二、效果展示 三、思路解析 1、首先我们需要将这个导航使用一个大…

gitee:删除仓库

1、点击主页面设置 2、找到左侧导航栏-数据管理->仓库空间信息&#xff1b;找到需要删除的仓库->点击设置 3、点击左侧仓库设置->点击右侧删除仓库 4、输入提示内容->确认删除 5、输入密码验证 6、成功删除提示

探索 Python 任务自动化的新境界:Invoke 库揭秘

文章目录 探索 Python 任务自动化的新境界&#xff1a;Invoke 库揭秘背景&#xff1a;为何选择 Invoke&#xff1f;什么是 Invoke&#xff1f;如何安装 Invoke&#xff1f;5个简单的库函数使用方法1. 定义任务2. 带参数的任务3. 运行 Shell 命令4. 任务参数化5. 列出任务 场景应…

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

1.前言 从一个高级语言到可执行程序&#xff0c;要经过预处理、编译&#xff0c;汇编和链接四个过程。大家可以思考下&#xff0c;为什么要有这样的过程&#xff1f; 我们学习计算机之处&#xff0c;就应该了解到&#xff0c;计算机能够识别的只有二进制语言&#xff08;这是…

六通道串口服务器

型号&#xff1a;SG-TCP232-620 1.1 功能 1.1.1 基本功能 串口服务器是串口 RS232/422/485 和以太网之间的一个转换器&#xff0c;实现串口数 据和以太网数据的双向透明传输&#xff0c;可以让串口设备立即联网&#xff0c;典型应用拓扑如下&#xff1a; 1.1.2 特色功能…

Ubuntu 18.04 中安装 RDKit(针对 Python 2.7)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

websocket前后端长连接之java部分

一共有4个类,第一个WebSocketConfig 配置类 Configuration EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {Autowiredprivate WebSocketHandler webSocketHandler;Autowiredprivate WebSocketInterceptor webSocketInterceptor;Overridepubli…

PyCharm中Python项目打包并运行到服务器的简明指南

目录 一、准备工作 二、创建并设置Python项目 创建新项目 配置项目依赖 安装PyInstaller 三、打包项目 打包为可执行文件 另一种打包方式&#xff08;使用setup.py&#xff09; 四、配置服务器环境 五、上传可执行文件到服务器 六、在服务器上运行项目 配置SSH解释…

【UE5 C++课程系列笔记】05——组件和碰撞

效果 可以看到我们可以实现的功能是 &#xff08;1&#xff09;可以通过鼠标旋转视角 &#xff08;2&#xff09;通过使用Pawn移动组件来控制Pawn移动 &#xff08;3&#xff09;Pawn碰到物体会被阻挡然后逐渐滑动 &#xff08;4&#xff09;通过空格切换激活/关闭粒子效果…

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积&#xff0c;其思想类似高中油膜法计算面积。其将点云投影到水平面&#xff0c;再将点云划分成尺寸相同的格网。最后&#xff0c;统计格网内包含点的数量number&#xff0c;那么可利用如下公式计算得到点云的面积&#xff1a; Aeranumber*L…

ZooKeeper 基础知识总结

先赞后看&#xff0c;Java进阶一大半 ZooKeeper 官网这样介绍道&#xff1a;ZooKeeper 是一种集中式服务&#xff0c;用于维护配置信息、命名、提供分布式同步和提供组服务。 各位hao&#xff0c;我是南哥&#xff0c;相信对你通关面试、拿下Offer有所帮助。 ⭐⭐⭐一份南哥编写…

2024年第十三届”认证杯“数学中国数学建模国际赛(小美赛)

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

ATTCK红队评估实战靶场(二)

http://vulnstack.qiyuanxuetang.net/vuln/?page2 描述&#xff1a;红队实战系列&#xff0c;主要以真实企业环境为实例搭建一系列靶场&#xff0c;通过练习、视频教程、博客三位一体学习。本次红队环境主要Access Token利用、WMI利用、域漏洞利用SMB relay&#xff0c;EWS re…

如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?

目前市面上主流播放RTSP视频流的方式是用服务器转码方案&#xff0c;这种方案的好处是兼容性更强&#xff0c;可以用于不同的平台&#xff0c;比如&#xff1a;Windows、Linux或者手机端&#xff0c;但是缺点也很明显&#xff1a;延迟高、播放高清或者同时播放多路视频视频容易…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下&#xff0c;其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

第五课 Unity资源导入工作流效率优化(AssetGraph工具)

上期我们学习了简单的animation动画的优化&#xff0c;接下来我们继续资源导入效率的优化 工程目录 首先我们来学习一下工程目录结构及用途 Asset文件夹&#xff1a;用来储存和重用的项目资产 Library文件夹&#xff1a;用来储存项目内部资产数据信息的目录 Packages文件夹…

Docker pull镜像拉取失败

因为一些原因&#xff0c;很多镜像仓库拉取镜像失败&#xff0c;所以需要更换不同的镜像&#xff0c;这是2024/11/25测试可用的仓库。 标题1、 更换镜像仓库的地址&#xff0c;编辑daemon.json文件 vi /etc/docker/daemon.json标题2、然后将下面的镜像源放进去或替换掉都可以…