查看完整版本: [-- Qt HTTP上传文件/下载文件 --]

QTCN开发网 -> Qt代码秀 -> Qt HTTP上传文件/下载文件 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

shixingya 2017-12-15 08:45

Qt HTTP上传文件/下载文件


一  、 上传文件
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();
}

shixingya 2017-12-15 10:33
上传多个文件:

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;
    }

liuchangyin 2017-12-16 12:15

stlcours 2017-12-21 21:10
请教一下楼主,或者各位大家,Qt客户端上传的代码已经没有问题了,那么HTTP Server的代码应该怎么写(怎么配置)呢?可以用Qt写吗?

夏德红 2017-12-26 16:30
不错

lsyzsl 2017-12-27 15:30
请问楼主,可以给个完整例子么?

q小玩家 2018-01-18 15:37
楼主请问报错"Error transferring http://192.168.0.1:180 - server replied: Method Not Allowed"是什么情况


查看完整版本: [-- Qt HTTP上传文件/下载文件 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled