QtHTTP实现文件上传和下载

源文件代码:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QString> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QUrl> #include <QFile> #include <QDebug> #include <QMessageBox> #include <QProgressBar> #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_uploadButton_clicked(); void on_downloadButton_clicked(); void readContent(); void replyFinished(QNetworkReply*); void loadError(QNetworkReply::NetworkError); void loadProgress(qint64 bytesSent,qint64 bytesTotal); private: Ui::MainWindow *ui; QNetworkReply *reply; QProgressBar *progressBar; QFile *file; }; #endif // MAINWINDOW_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_uploadButton_clicked()    //上传文件
{
    file = new QFile("C:/Users/Administrator/Desktop/test.jpg");
    file->open(QIODevice::ReadOnly);

    QNetworkAccessManager *accessManager1 = new QNetworkAccessManager(this);  //在服务器上创建目录
    accessManager1->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QByteArray data;
    QUrl url1("http://192.168.1.166:80/createFolder.php?foldername=upload");
    QNetworkRequest request1(url1);
    request1.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/octet-stream"));
    accessManager1->post(request1, data);

    QNetworkAccessManager *accessManager2 = new QNetworkAccessManager(this);    //往该目录中上传文件
    accessManager2->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QByteArray byte_file = file->readAll();
    QUrl url2("http://192.168.1.166:80/upload.php?foldername=upload&filename="+ui->lineEdit->text()+".jpg");    //如这里指定的上传文件至HTTP服务器目录中的upload目录中
    QNetworkRequest request2(url2);
    request2.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
    reply = accessManager2->post(request2, byte_file);

    progressBar = new QProgressBar();
    progressBar->setValue(0);
    progressBar->show();

    connect(accessManager2,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(loadError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(uploadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));
}

void MainWindow::on_downloadButton_clicked()    //下载文件
{
    file = new QFile(QApplication::applicationDirPath() + "/" + ui->lineEdit->text() + ".jpg");
    file->open(QIODevice::WriteOnly);

    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);
    accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);
    QUrl url("http://192.168.1.166:80/test.jpg");

    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
    reply = accessManager->get(request);

    progressBar = new QProgressBar();
    progressBar->setValue(0);
    progressBar->show();

    connect((QObject *)reply, SIGNAL(readyRead()), this, SLOT(readContent()));
    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(loadError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(downloadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));
}

void MainWindow::readContent()    //下载时向本地文件中写入数据
{
    file->write(reply->readAll());
}

void MainWindow::replyFinished(QNetworkReply*)    //删除指针,更新和关闭文件
{
    if(reply->error() == QNetworkReply::NoError)
        {
            reply->deleteLater();
            file->flush();
            file->close();
        }
        else
        {
            QMessageBox::critical(NULL, tr("Error"), "Failed!!!");
        }
}

void MainWindow::loadProgress(qint64 bytesSent, qint64 bytesTotal)    //更新进度条
{
       qDebug() << "loaded" << bytesSent << "of" << bytesTotal;
       progressBar->setMaximum(bytesTotal); //最大值
       progressBar->setValue(bytesSent);  //当前值
}

void MainWindow::loadError(QNetworkReply::NetworkError)    //传输中的错误输出
{
     qDebug()<<"Error: "<<reply->error();
}
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值