代码之家  ›  专栏  ›  技术社区  ›  mosg

在qt4上使用post方法上载文件

  •  7
  • mosg  · 技术社区  · 14 年前

    我正在寻找一个基本的代码示例,说明如何使用qt上的http post方法将文件上传到服务器。

    我的 任务 :我有一个简单的qt程序,我需要从本地主机选择任何图像文件并将其上载到服务器。选择部分和gui很简单,我已经完成了,但是对于post上传,我很困惑。另外我不得不说,没有上传文件的授权。

    如果有人已经在找这个话题了?

    注:我问自己为什么不给自己编码是因为时间,我需要尽快得到这个方法。

    谢谢你,我这边所有的成功解决方案都会贴在这里。

    补充: 这是我的代码,还没用。已找到上载网站 here .

    void    CDialog::on_uploadButton_clicked() {
    
        QFileInfo fileInfo(absPathLineEdit->text());
    
        if (!fileInfo.exists()) {
            QMessageBox::information(this, 
                tr("Information"), 
                tr("File doesn't exists! Please, select another image."));
            return;
        }
    
        file = new QFile(fileInfo.filePath());
        if (!file->open(QIODevice::ReadOnly)) {
            QMessageBox::information(this,
                tr("Information"),
                tr("Unable to open file for reading!"));
            return;
        }
    
        QString host = "http://data.cod.ru";
    
        QUrl url(host);
    
        QHttp::ConnectionMode mode = QHttp::ConnectionModeHttp;
        http->setHost(url.host(), mode, (url.port() == -1) ? 80 : url.port());
    
        QHttpRequestHeader header("POST", "/", 1, 1);
        header.setValue("Host", "data.cod.ru");
        header.setValue("Content-type", "multipart/form-data, boundary=AaB03x");
        header.setValue("Cache-Control", "no-cache");
        header.setValue("Accept", "*/*");
    
        QByteArray bytes(fileInfo.filePath().toUtf8());
        QByteArray totalBytes;
        totalBytes.append("--AaB03x\r\n");
        totalBytes.append("Content-Disposition: form-data; name=\"email\"\r\n");
        totalBytes.append("\r\n");
        totalBytes.append("billgates@microsoft.com\r\n");
        totalBytes.append("--AaB03x\r\n");
        totalBytes.append("Content-Disposition: form-data; name=\"photo\"; filename=\"" + bytes+ "\"\r\n");
        totalBytes.append("Content-Transfer-Encoding: binary\r\n\r\n");
        totalBytes.append(file->readAll());
        totalBytes.append("\r\n");
        totalBytes.append("--AaB03x--");
    
        header.setContentLength(totalBytes.length());
    
        httpRequestAborted = false;
        httpGetId = http->request(header, totalBytes);
    
        file->close();
    }
    

    并阅读下面的应答函数:

    void    CDialog::httpRequestFinished(int requestId, bool error) {
    
        if (requestId != httpGetId)
            return;
    
        if (httpRequestAborted) {
            if (file) {
                file->close();
    //          file->remove();
    //          delete file;
                file = 0;
            }
            return;
        }
    
        if (requestId != httpGetId)
            return;
    
        file->close();
    
        if (error) {
    //      file->remove();
            QMessageBox::information(this, tr("HTTP"),
                tr("Download failed: %1.")
                .arg(http->errorString()));
        } else {
            QByteArray data = http->readAll();
            QFile *dataFile = new QFile("answer.txt");
            dataFile->open(QIODevice::WriteOnly | QIODevice::Text);
            dataFile->write(data);
            dataFile->flush();
            dataFile->close();
        }
    
    //  delete file;
        file = 0;
    }
    
    4 回复  |  直到 8 年前
        1
  •  10
  •   serge_gubenko    14 年前

    我看到您正在尝试使用qhttp和qhttprequestheader类。qt文档表示不赞成:

    这个类已过时。提供 使旧的源代码继续工作。我们 强烈建议不要在 新代码。

    所以,正如之前建议的那样;我建议使用 QNetworkAccessManager 为了你想做的事

    至于您最初的问题;您仍然可以使用qhttp上传文件;我相信实际的请求头结构取决于您试图访问的特定站点。在这种情况下,工具像 wireshark 会有很大帮助的。请检查下面的代码是否适合您,如果返回302响应,它应该从主文件夹上传test1.jpg文件并将其链接转储到服务器上。

    void MainWindow::on_pushButton_clicked()
    {   
        http = new QHttp(this); // http declared as a member of MainWindow class 
        connect(http, SIGNAL(requestFinished(int,bool)), SLOT(httpRequestFinished(int, bool)));
    
        QString boundary = "---------------------------723690991551375881941828858";
    
        // action
        QByteArray data(QString("--" + boundary + "\r\n").toAscii());
        data += "Content-Disposition: form-data; name=\"action\"\r\n\r\n";
        data += "file_upload\r\n";
    
        // file
        data += QString("--" + boundary + "\r\n").toAscii();
        data += "Content-Disposition: form-data; name=\"sfile\"; filename=\"test1.jpg\"\r\n";
        data += "Content-Type: image/jpeg\r\n\r\n";
    
        QFile file("/home/test1.jpg");
        if (!file.open(QIODevice::ReadOnly))
            return;
    
        data += file.readAll();
        data += "\r\n";
    
        // password
        data += QString("--" + boundary + "\r\n").toAscii();
        data += "Content-Disposition: form-data; name=\"password\"\r\n\r\n";
        //data += "password\r\n"; // put password if needed
        data += "\r\n";
    
        // description
        data += QString("--" + boundary + "\r\n").toAscii();
        data += "Content-Disposition: form-data; name=\"description\"\r\n\r\n";
        //data += "description\r\n"; // put description if needed
        data += "\r\n";
    
        // agree
        data += QString("--" + boundary + "\r\n").toAscii();
        data += "Content-Disposition: form-data; name=\"agree\"\r\n\r\n";
        data += "1\r\n";
    
        data += QString("--" + boundary + "--\r\n").toAscii();
    
        QHttpRequestHeader header("POST", "/cabinet/upload/");
        header.setValue("Host", "data.cod.ru");
        header.setValue("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9");
        header.setValue("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        header.setValue("Accept-Language", "en-us,en;q=0.5");
        header.setValue("Accept-Encoding", "gzip,deflate");
        header.setValue("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        header.setValue("Keep-Alive", "300");
        header.setValue("Connection", "keep-alive");
        header.setValue("Referer", "http://data.cod.ru/");
    
        //multipart/form-data; boundary=---------------------------723690991551375881941828858
    
        header.setValue("Content-Type", "multipart/form-data; boundary=" + boundary);
        header.setValue("Content-Length", QString::number(data.length()));
    
        http->setHost("data.cod.ru");
        http->request(header, data);
    
        file.close();
    }
    
    void MainWindow::httpRequestFinished(int, bool)
    {
        QHttpResponseHeader responce = http->lastResponse();
        if (responce.statusCode()==302)
        {
            qDebug() << "file accepted; get it from:";
            qDebug() << "data.cod.ru" << responce.value("Location");
        }
    }
    

    在mainwindow类的signals部分声明的httprequestfinished

    希望这有帮助,女贞;)

        2
  •  9
  •   mosg    14 年前

    另外,我发现今天的代码很好: link text

    它是基于qt4的上传/下载应用,里面有qnetworkaccessmanager管理的全套post头,所以对于初学者来说非常有用。

    业主: 刚度

    Committer: 霍克斯诺克斯

        3
  •  1
  •   guruz    14 年前

    使用qnetworkaccessmanager。

    manager.post(your_qhttpnetworkrequest, your_image_qfile);
    
        4
  •  -2
  •   slex    8 年前
    QPixmap pix(path);
    QByteArray bytes, data;
    QBuffer buffer(&bytes);
    if(!buffer.open(QIODevice::WriteOnly)) {
        return;
    }
    
    pix.save(&buffer, "JPG");  
    

    data.append(“内容配置:表单数据;名称=\”照片“;文件名=\”-\“\r\n”); data.append(“内容类型:image/jpg\r\n\r\n”); //data.append(“内容传输编码:binary\r\n”); data.append(字节); data.append(“\r\n”); data.append(“--asrf456bge4h\r\n”);