搭建文件服务器并使用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.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        
<Directory  "/var/www/html">
          Dav on
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Require all granted
          allow 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.password
        AuthBasicProvider file
 # 允许userfile.pass里的所有用户访问       
        Require valid-user
        AllowOverride 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_NAMESPACE

class MainInterface : public QMainWindow
{
    Q_OBJECT

public:
    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()<<"打开文件失败";
    }

}



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab导出3D彩色模型(surface类转stl,并对白模上色)

在matlab中绘制3维图形时&#xff0c;需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳&#xff0c;无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型&#xff0c;然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…

Java项目中加缓存

Java项目中加缓存 1.更新频率低&#xff1b;但读写频率高的数据很适合加缓存&#xff1b; 2.可以加缓存的地方很多&#xff1a;浏览器的缓存&#xff1b;CDN的缓存&#xff1b;服务器的缓存&#xff1b; 本地内存&#xff1b;分布式远端缓存&#xff1b; 加缓存的时候不要…

VTK的基本概念(一)

文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中&#xff0c;可以有多个灯光的存在&#xff0c;灯光和相机是三维渲染场景的必备要素&#xff0c;如果没有指定的话&#xff0c;vtkRenderer会自动创建默认的灯光和相机。…

【C知道】数据包捕获(wire shark)

请解释一下数据包捕获和分析工具&#xff08;如Wireshark&#xff09;的工作原理和用途。 数据包捕获和分析工具&#xff0c;例如Wireshark&#xff08;以前称为 Ethereal&#xff09;&#xff0c;是一种网络协议分析软件&#xff0c;它允许用户实时监控计算机网络中的数据传输…

浮点数计算,不丢失精度

在js中对于浮点数直接计算会存在精度丢失的情况&#xff0c;为了保证精度问题&#xff0c;可以做如下处理&#xff1a; 浮点数精度计算 主要流程如下&#xff1a; 浮点数转换成整数 示例代码如下 /** 将一个浮点数转成整数&#xff0c;返回整数和倍数。如 3.14 >> 314…

计算机网络八股整理(三)

目录 计算机网络八股&#xff08;三&#xff09;传输层1&#xff1a;说一下tcp的头部&#xff1f;2&#xff1a;tcp三次握手的过程说一下&#xff1f;拓展linux中查看tcp状态&#xff1a; 3:tcp为什么需要三次握手建立连接&#xff1f;4&#xff1a;tcp三次握手&#xff0c;如果…

C#基础控制台程序

11.有一个54的矩阵&#xff0c;要求编程序求出其中值最大的那个元素的值&#xff0c;以及其所在的行号和列号。 12.从键盘输入一行字符&#xff0c;统计其中有多少个单词&#xff0c;单词之间用空格分隔开。 13.输入一个数&#xff0c;判断它是奇数还是偶数&#xff0c;如果…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

LeetCode—74. 搜索二维矩阵(中等)

仅供个人学习使用 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true…

命令行使用ssh隧道连接远程mysql

本地电脑A 跳板机B 主机2.2.2.2 用户名 B ssh端口号22 登录密码bbb 远程mysql C 地址 3.3.3.3 端口号3306 用户名C 密码ccc A需要通过跳板机B才能访问C; navicat中配置ssh可以实现在A电脑上访问C 如何实现本地代码中访问C呢? # 假设本地使…

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前&#xff0c;我们先做个小调查&#xff1a;在日常工作中&#xff0c;你会使用自动化工作流工具吗&#xff1f;&#x1f64b; 事实上&#xff0c;工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客&#xff0c;跟大家分享五个好用的工作流工具。…

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域&#xff0c;Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力&#xff0c;为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能&#xff0c;还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…

重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!

模型简介 Video-Retalking 模型是一种基于深度学习的视频再谈话技术&#xff0c;它通过分析视频中的音频和图像信息&#xff0c;实现视频角色口型、表情乃至肢体动作的精准控制与合成。这一技术的实现依赖于强大的技术架构和核心算法&#xff0c;特别是生成对抗网络&#xff0…

Llama-2-7b:vocab size:32000;embeddings:4096;hidden_layers是什么意思

目录 Llama-2-7b:vocab size:32000;embeddings:4096 vocab size:模型能解析词汇数量==n_vocab num_hidden_layers: 32 nanogpt隐藏层4 "initializer_range": 0.02 Token Embed是什么 举例说明 不同Chat版本的Token Embed(Token Embeddings) 区别 Llama…

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值1,值…

【模电】整流稳压电源

1.整流稳压电源 主要由四大部分组成&#xff0c;分别是&#xff1a; 1&#xff09;电源变压器 2&#xff09;整流电路 3&#xff09;滤波电路 4&#xff09;稳压电路 2.整流电路 2.1半波整流 2.1.1工作原理 平均电压计算 结构最简单&#xff0c;但是只利用了了半个周期的…

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

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