添加Qt文件上传案例

上级 50757256
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp \
upload_file_manager.cpp
HEADERS += \
mainwindow.h \
upload_file_manager.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include <QPushButton>
#include <QtWidgets>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QProgressBar>
#include <QNetworkAccessManager>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QNetworkRequest>
#include <QFile>
#include <QNetworkReply>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, selectFilePathButton(new QPushButton("选择文件路径"))
, uploadButton(new QPushButton("上传"))
, filePathEdit(new QLineEdit())
, fileLayout(new QHBoxLayout())
, mainLayout(new QVBoxLayout())
, progressBar(new QProgressBar())
{
InitUI();
InitConnect();
}
MainWindow::~MainWindow()
{
}
void MainWindow::InitUI()
{
QWidget *centerWidget = new QWidget(this);
progressBar->hide();
fileLayout->addWidget(selectFilePathButton) ;
fileLayout->addWidget(filePathEdit);
mainLayout->addLayout(fileLayout);
mainLayout->addWidget(uploadButton);
mainLayout->addWidget(progressBar);
centerWidget->setLayout(mainLayout);
mainLayout->addStretch();
setCentralWidget(centerWidget);
}
void MainWindow::InitConnect()
{
connect(selectFilePathButton,&QPushButton::clicked,this,&MainWindow::slotSelectFilePath);
connect(uploadButton,&QPushButton::clicked,this,&MainWindow::slotSelectUploadFile);
connect(&uploadFileManager,&UploadFileManager::sigUploadProgress,this,&MainWindow::slotUploadProgress);
connect(&uploadFileManager,&UploadFileManager::sigFinish,this,&MainWindow::slotUploadFinished);
}
void MainWindow::slotSelectFilePath()
{
QString filePath = QFileDialog::getOpenFileName(this);
filePathEdit->setText(filePath);
}
void MainWindow::slotSelectUploadFile()
{
uploadButton->setDisabled(true);
progressBar->show();
uploadFileManager.UploadFile("http://test.open-ssl.cn/upload.php",filePathEdit->text());
}
void MainWindow::slotUploadFinished(QNetworkReply::NetworkError status)
{
uploadButton->setDisabled(false);
progressBar->hide();
if (status == QNetworkReply::NoError) {
qInfo() << "upload success!";
} else {
qInfo() << "upload failed:";
}
}
void MainWindow::slotUploadProgress(int value)
{
progressBar->setValue(value);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "upload_file_manager.h"
class QPushButton;
class QLineEdit;
class QHBoxLayout;
class QVBoxLayout;
class QProgressBar;
class QNetworkReply;
class QNetworkAccessManager;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void InitUI();
void InitConnect();
public Q_SLOTS:
void slotSelectFilePath();
void slotSelectUploadFile();
void slotUploadFinished(QNetworkReply::NetworkError status);
void slotUploadProgress(int value);
// void slotUploadProgress(qint64 bytesSent, qint64 bytesTotal);
private:
QPushButton *selectFilePathButton;
QPushButton *uploadButton;
QLineEdit *filePathEdit;
QHBoxLayout *fileLayout;
QVBoxLayout *mainLayout;
QProgressBar *progressBar;
UploadFileManager uploadFileManager;
};
#endif // MAINWINDOW_H
#include "upload_file_manager.h"
#include <QNetworkAccessManager>
#include <QFile>
#include <QHttpPart>
#include <QFileInfo>
#include <QNetworkReply>
UploadFileManager::UploadFileManager(QObject *parent)
: QObject(parent)
, manager(new QNetworkAccessManager(this))
{
}
void UploadFileManager::UploadFile(QString url, QString filePath)
{
QFile *file = new QFile(filePath);
if(!file->open(QIODevice::ReadOnly)){
return;
}
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + QFileInfo(*file).fileName() + "\""));
filePart.setBodyDevice(file);
QNetworkRequest request((QUrl(url)));
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
multiPart->append(filePart);
QNetworkReply *reply = manager->post(request, multiPart);
connect(reply, &QNetworkReply::uploadProgress,this, [&](qint64 bytesSent, qint64 bytesTotal){
qInfo()<<"bytesSent:"<<bytesSent<<",bytesTotal:"<<bytesTotal;
if(bytesTotal !=0 )
emit sigUploadProgress((bytesSent*1.0/bytesTotal)*100);
});
connect(manager, &QNetworkAccessManager::finished, this, &UploadFileManager::slotUploadFinished);
}
void UploadFileManager::slotUploadFinished(QNetworkReply *reply)
{
if(reply)
emit sigFinish(reply->error());
reply->deleteLater();
}
#ifndef UPLOAD_FILE_MANAGER_H
#define UPLOAD_FILE_MANAGER_H
#include <QObject>
#include <QNetworkReply>
class QNetworkAccessManager;
class UploadFileManager : public QObject
{
Q_OBJECT
public:
explicit UploadFileManager(QObject *parent = nullptr);
QNetworkAccessManager *manager;
public:
/**
* @brief UploadFile
* @param url
* @param filePath
*/
void UploadFile(QString url,QString filePath);
public Q_SLOTS:
void slotUploadFinished(QNetworkReply *reply);
signals:
/**
* @brief sigFinish
* @param status
*/
void sigFinish(QNetworkReply::NetworkError status);
/**
* @brief sigUploadProgress
* @param value
*/
void sigUploadProgress(int value);
};
#endif // UPLOAD_FILE_MANAGER_H
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册