搭建文件服务器并使用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.mzph.cn/bicheng/62424.shtml

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

相关文章

自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析

前言&#xff1a;公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值&#xff0c;我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一&#xff1a;开头加一条环境变量&#xff0c;执行脚本后&#xff0c;提示输入&#xff1a;需要查询的命名空间&#xff0c…

springboot332基于springboot养老院管理系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 养老院管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计…

js:函数

函数 函数&#xff1a;实现抽取封装&#xff0c;执行特定任务的代码块&#xff0c;方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词&#xff0c;如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参&#xff0c;实际上写的数据叫实…

基于Matlab的图像去噪算法仿真

中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪&#xff0c;并用Matlab软件仿真。 &#xff08;1&#xff09;给图像加入均值为0&#xff0c;方差为0.02的高斯噪声&#xff0c;分别选择33模板、55模板和77模板进行去噪 Matlab部分代码&#xff1…

【Linux】-学习笔记06

第二章、时间同步服务器 2.1时间同步服务器的使用 2.1.1系统时区时间的管理 timedatectl set-time "2024-02-13 10:41:55" ##设定系统时间 timedatectl list-timezones ##显示系统的所有时区 timedatectl set-timezone "Asia/Shangh…

UE5_建立自己的资产库

资产库需要用到一个插件&#xff1a; UAsset Browser - 直接在当前项目预览其他UE项目资产&#xff08;.uasset 文件&#xff09; - 直接迁移其他UE项目资产到当前项目 - 不用另外打开资产项目查看资产&#xff0c;迁移资产&#xff08;麻烦&#xff09; 插件官网插件文档插…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

深度学习基本单元结构与输入输出维度解析

深度学习基本单元结构与输入输出维度解析 在深度学习领域&#xff0c;模型的设计和结构是理解其性能和应用的关键。本文将介绍深度学习中的基本单元结构&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、反卷积&#xff08;转置卷积&#xff09;、循环神经网络&…

乐鑫发布 esp-iot-solution v2.0 版本

今天&#xff0c;乐鑫很高兴地宣布&#xff0c;esp-iot-solution v2.0 版本已经发布&#xff0c;release/v2.0 分支下的正式版本组件将为用户提供为期两年的 Bugfix 维护&#xff08;直到 2027.01.25 ESP-IDF v5.3 EOL&#xff09;。该版本将物联网开发中常用的功能进行了分类整…

面经-综合面/hr面

面经-综合面/hr面 概述1.大学期间遇到的困难&#xff0c;怎么解决的2. 大学期间印象最深/最难忘的是什么3. 大学里面担任了什么职务没&#xff1f;做了什么工作&#xff1f;4. 大学最大的遗憾是什么&#xff1f;5. 对自己的未来规划6. 对自己的评价7. 自己的优缺点8. 对公司的认…

pyspark实现基于协同过滤的电影推荐系统

最近在学一门大数据的课&#xff0c;课程要求很开放&#xff0c;任意做一个大数据相关的项目即可&#xff0c;不知道为什么我就想到推荐算法&#xff0c;一直到着手要做之前还没有新的更好的来代替&#xff0c;那就这个吧。 推荐算法 推荐算法的发展由来已久&#xff0c;但和…

十、Spring Boot集成Spring Security之HTTP请求授权

文章目录 往期回顾&#xff1a;Spring Boot集成Spring Security专栏及各章节快捷入口前言一、HTTP请求授权工作原理二、HTTP请求授权配置1、添加用户权限2、配置ExceptionTranslationFilter自定义异常处理器3、HTTP请求授权配置 三、测试接口1、测试类2、测试 四、总结 往期回顾…

Unity3d C# 实现一个基于UGUI的自适应尺寸图片查看器(含源码)

前言 Unity3d实现的数字沙盘系统中&#xff0c;总有一些图片或者图片列表需要点击后弹窗显示大图&#xff0c;这个弹窗在不同尺寸分辨率的图片查看处理起来比较麻烦&#xff0c;所以&#xff0c;需要图片能够根据容器的大小自适应地进行缩放&#xff0c;兼容不太尺寸下的横竖图…

DVWA 在 Windows 环境下的部署指南

目录预览 一、靶场介绍二、前置准备1. 环境准备2.靶场下载 三、安装步骤1.配置Phpstudy2.配置数据库3.配置DVWA4.登入DVWA靶场 四、参考链接 一、靶场介绍 DVWA 一共包含了十个攻击模块&#xff0c;分别是&#xff1a; Brute Force&#xff08;暴力&#xff08;破解&#xff…

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…

使用UE5.5的Animator Kit变形器

UE5.5版本更新了AnimatorKit内置插件&#xff0c;其中包含了一些内置变形器&#xff0c;可以辅助我们的动画制作。 操作步骤 首先打开UE5.5&#xff0c;新建第三人称模板场景以便测试&#xff0c;并开启AnimatorKit组件。 新建Sequence&#xff0c;放入测试角色 点击角色右…

应用案例丨坤驰科技双通道触发采集实时FFT数据处理系统

双通道触发采集实时FFT数据处理系统 应用案例 双通道采集&#xff0c;每路通道需要2GSPS的采样率&#xff0c;每2毫秒采集一次&#xff0c;每次采集数据量为65536*2 Sample。采集的信号频率满足奈奎斯特采样定律。采集数据后&#xff0c;每路通道的数据均做运算以及FFT实时处理…

OGRE 3D----3. OGRE绘制自定义模型

在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人&#xff0c;我最常用的工具是Excel&#xff0c;对于我来说用Excel处理繁琐冗杂的数据并不难&#xff0c;但是我发现身边很多人用Excel做的数据报表非常的耗时&#xff0c;而且最后的成品也是难以直视&#xff0c;逻辑和配色等都非常的“灾难”。…

基于FPGA的SD NAND读写测试(图文并茂+源代码+详细注释)

本实验所使用的源代码已同步至个人主页的资源处&#xff0c;可供读者自行学习...... 什么是SD NAND&#xff1f; 1.SD NAND 卡介绍 SD NAND 卡是一种基于 NAND 闪存技术的存储设备&#xff0c;其外观和接口类似于标准的 SD 卡。它将 NAND 闪存芯片和必要的控制电路集成在一个小…