• 14513阅读
  • 6回复

Qt HTTP上传文件/下载文件 [复制链接]

上一主题 下一主题
离线shixingya
 

只看楼主 倒序阅读 楼主  发表于: 2017-12-15

一  、 上传文件
QString  url_ ="http://172.24.25.34:8288/storage/uploadImage";
    QString uploadFilename="D:/12121.png";

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QHttpPart textPart;
    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"watermark\""));
    textPart.setBody("my text");
    multiPart->append(textPart);

    QHttpPart imagePart;
    QFile *file = new QFile(uploadFilename);
    file->open(QIODevice::ReadOnly);
    imagePart.setBodyDevice(file);
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"filename\"; filename=\"12121.png\""));

    multiPart->append(imagePart);

    QUrl url(url_);
    QNetworkRequest request(url);

    QNetworkAccessManager *networkManager= new QNetworkAccessManager;
    QNetworkReply *_reply = networkManager->post(request, multiPart);
    multiPart->setParent(_reply); // delete the multiPart with the reply

    QEventLoop loop;
    connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(upLoadError(QNetworkReply::NetworkError)));
    connect(_reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( OnUploadProgress(qint64 ,qint64 )));
    connect(_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);

    loop.exec();

    //获取http状态码
    int http_code_ = _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    // 获取数据
    if (QNetworkReply::NoError == _reply->error())
    {
        QByteArray context_ = _reply->readAll();
        QJsonObject result_obj = QJsonDocument::fromJson(context_).object();
        int code = result_obj.value("code").toInt();
        qDebug()<<"code === "<<code<<result_obj;
    }


二、 下载文件

void downloadFile(QString url, QString localPath)
{
    if(nullptr==file)
        file=new QFile();
    file->setFileName(localPath);
    //判断文件是否存在
    if(file->exists()){
        qDebug()<<"文件已存在";
    }else{
        qDebug()<<"文件不存在";
    }
    //已读写方式打开文件,
    //如果文件不存在会自动创建文件
    if(!file->open(QIODevice::ReadWrite)){
        qDebug()<<"打开失败";
    }else{
        qDebug()<<"打开成功";
    }
    if (!file)
        return;

    const QUrl newUrl = QUrl::fromUserInput(url);
    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);
    accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

    reply= (*accessManager).get(QNetworkRequest(newUrl));
    connect(reply, SIGNAL(downloadProgress(qint64 ,qint64)), this, SIGNAL(updataProgress(qint64,qint64)),Qt::AutoConnection);
    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

    connect(reply, &QIODevice::readyRead, this, &TaskRunner::readContent);
    _thread=new QThread;
    this->moveToThread(_thread);
    _thread->start();
}
本人2008年9月至2012年6月在三亚学院学习计算机科学与技术专业四年,2012年6月毕业后至今一直在北京市从事软件开发相关工作。本人的技术栈是C++、熟悉Qt、CEF框架。参与或负责过多款Windows、Linux环境下桌面软件的研发。
参加工作十年来,使用Qt参与开发过一个军工仿真想定建模工具,仿真陆、海、空潜等各兵种的作战平台(包括地面车辆、水面舰艇、固定翼/旋转翼飞机、潜艇等)的运动方式和工作流程,实现陆、海、空、潜立体化协同作战仿真。在国美调研过电商OA办公工具的开发设计、在广联达参与了BIM软件的协作开发、在书生电子独立负责过OFD版式阅读器客户端的开发、在跟谁学使用Qt WebEngine、QGraphics等主导了练习批改工具的开发,在蓝湖基于WebAssembly对标Figma参与开发了一款原型设计工具mastergo,在小米集团技术委员会承担了平台应用研发工作,目前在凌云光从事视觉相关应用平台开发。十多年的软件开发工作,让我在软件工程、程序设计、系统架构方面积累了丰富且宝贵的经验。
有同行的朋友,可以加我微信,一起进步
我叫史星亚 微信: EagleAndy  
加好友时请备注  来自qtcn
我有个Qt交友群,拉您入群
非工作时间 可以电联 18610042411
*********************************************************
另低价出售
→各种软件小程序定制!
→SAP教程,涵盖BI/SD/FICO/HANA等各种模块视频教程,购买教程,拾取金领顾问教程!
→各种考证考研题库,保证考证考研成功上岸!
→抖音快手微博朋友圈各种点赞支持,最快一分钟上万赞!
→挂机打卡,远程叫醒,等各种服务欢迎私信EagleAndy开启!
转发此内容,私信EagleAndy,有定制盲盒寄送!
离线shixingya

只看该作者 1楼 发表于: 2017-12-15
上传多个文件:

QString  url_ ="http://172.24.25.34:8288/storage/uploadImage";
    QStringList fileListStr ;
    fileListStr<<"D:/33.jpeg"<<"D:/2232.png";

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    for(int i=0; i<fileListStr.count(); i++)
    {
        QHttpPart imagePart;
        QString filePath =fileListStr;
        QFile *file = new QFile(filePath);
        file->open(QIODevice::ReadOnly);
        imagePart.setBodyDevice(file);
        QString filename =filePath.split("/").last();
        QString contentVariant=QString("form-data; name=\"filename\"; filename=\"%1\"").arg(filename);
        imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(contentVariant));
        multiPart->append(imagePart);
    }



    QUrl url(url_);
    QNetworkRequest request(url);

    QNetworkAccessManager *networkManager= new QNetworkAccessManager;
    QNetworkReply *_reply = networkManager->post(request, multiPart);
    multiPart->setParent(_reply); // delete the multiPart with the reply

    QEventLoop loop;
    connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(upLoadError(QNetworkReply::NetworkError)));
    connect(_reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( OnUploadProgress(qint64 ,qint64 )));
    connect(_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);

    loop.exec();

    //获取http状态码
    int http_code_ = _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    // 获取数据
    if (QNetworkReply::NoError == _reply->error())
    {
        QByteArray context_ = _reply->readAll();
        QJsonObject result_obj = QJsonDocument::fromJson(context_).object();
        int code = result_obj.value("code").toInt();
        qDebug()<<"code === "<<code<<result_obj;
    }
本人2008年9月至2012年6月在三亚学院学习计算机科学与技术专业四年,2012年6月毕业后至今一直在北京市从事软件开发相关工作。本人的技术栈是C++、熟悉Qt、CEF框架。参与或负责过多款Windows、Linux环境下桌面软件的研发。
参加工作十年来,使用Qt参与开发过一个军工仿真想定建模工具,仿真陆、海、空潜等各兵种的作战平台(包括地面车辆、水面舰艇、固定翼/旋转翼飞机、潜艇等)的运动方式和工作流程,实现陆、海、空、潜立体化协同作战仿真。在国美调研过电商OA办公工具的开发设计、在广联达参与了BIM软件的协作开发、在书生电子独立负责过OFD版式阅读器客户端的开发、在跟谁学使用Qt WebEngine、QGraphics等主导了练习批改工具的开发,在蓝湖基于WebAssembly对标Figma参与开发了一款原型设计工具mastergo,在小米集团技术委员会承担了平台应用研发工作,目前在凌云光从事视觉相关应用平台开发。十多年的软件开发工作,让我在软件工程、程序设计、系统架构方面积累了丰富且宝贵的经验。
有同行的朋友,可以加我微信,一起进步
我叫史星亚 微信: EagleAndy  
加好友时请备注  来自qtcn
我有个Qt交友群,拉您入群
非工作时间 可以电联 18610042411
*********************************************************
另低价出售
→各种软件小程序定制!
→SAP教程,涵盖BI/SD/FICO/HANA等各种模块视频教程,购买教程,拾取金领顾问教程!
→各种考证考研题库,保证考证考研成功上岸!
→抖音快手微博朋友圈各种点赞支持,最快一分钟上万赞!
→挂机打卡,远程叫醒,等各种服务欢迎私信EagleAndy开启!
转发此内容,私信EagleAndy,有定制盲盒寄送!
离线liuchangyin

只看该作者 2楼 发表于: 2017-12-16
离线stlcours

只看该作者 3楼 发表于: 2017-12-21
请教一下楼主,或者各位大家,Qt客户端上传的代码已经没有问题了,那么HTTP Server的代码应该怎么写(怎么配置)呢?可以用Qt写吗?
离线夏德红

只看该作者 4楼 发表于: 2017-12-26
不错
离线lsyzsl

只看该作者 5楼 发表于: 2017-12-27
请问楼主,可以给个完整例子么?
离线q小玩家

只看该作者 6楼 发表于: 2018-01-18
楼主请问报错"Error transferring http://192.168.0.1:180 - server replied: Method Not Allowed"是什么情况
快速回复
限100 字节
 
上一个 下一个