首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qt QNetworkRequest上传文件

使用Qt QNetworkRequest上传文件
EN

Stack Overflow用户
提问于 2013-05-24 21:01:43
回答 1查看 9K关注 0票数 9

我在尝试使用QNetworkRequest将文件上传到服务器时遇到了一些问题。我主要使用这个链接(http://qt-project.org/forums/viewthread/11361)作为模板,但仍然收到POST错误(具体地说是203)。这是我到目前为止所拥有的。

代码语言:javascript
复制
void MainWindow::processFile(){

    QByteArray postData;
    //Look below for buildUploadString() function
    postData = mReport->buildUploadString();

    QUrl mResultsURL = QUrl("http://" + VariableManager::getInstance()->getServerIP() +  "/uploadFile.php");
    QNetworkAccessManager* mNetworkManager = new QNetworkAccessManager(this);


    QString bound="margin"; //name of the boundary

    QNetworkRequest request(mResultsURL); //our server with php-script
    request.setRawHeader(QString("Content-Type").toAscii(),QString("multipart/form-data; boundary=" + bound).toAscii());
    request.setRawHeader(QString("Content-Length").toAscii(), QString::number(postData.length()).toAscii());


    connect(mNetworkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(printScriptReply(QNetworkReply*))); //This slot is used to debug the output of the server script
    mNetworkManager->post(request,postData);
}


QByteArray ReportParser::buildUploadString()
{
    QString path = VariableManager::getInstance()->getReportDirectory();
    path.append("\\\\");
    path.append(getReportFileName());


    QString bound="margin";
    QByteArray data(QString("--" + bound + "\r\n").toAscii());
    data.append("Content-Disposition: form-data; name=\"action\"\r\n\r\n");
    data.append("uploadFile.php\r\n");   
    data.append(QString("--" + bound + "\r\n").toAscii());   
    data.append("Content-Disposition: form-data; name=\"uploaded\"; filename=\"");
    data.append(getReportFileName());
    data.append("\"\r\n");  
    data.append("Content-Type: text/xml\r\n\r\n"); //data type

    QFile file(path);
        if (!file.open(QIODevice::ReadOnly)){
            qDebug() << "QFile Error: File not found!";
            return data;
        } else { qDebug() << "File found, proceed as planned"; }

    data.append(file.readAll());           
    data.append("\r\n");
    data.append("--" + bound + "--\r\n");  //closing boundary according to rfc 1867


    file.close();

    return data;
}

下面是服务器上处理该文件的脚本:

代码语言:javascript
复制
<?php

       $uploaded_type = $_FILES['uploaded']['type'];

    $target = "/var/www/webpage/results/";
    $target = $target . basename( $_FILES['uploaded']['name']) ;
    $ok=1;

    echo "target: ";
    echo $target;

    //This is our limit file type condition
    if ($uploaded_type =="text/xml"){
            echo "We have an xml file!\r\n";
    }

    //Here we check that $ok was not set to 0 by an error
    //If everything is ok we try to upload it
    if ($ok==0){

            echo "Sorry your file was not uploaded";

    } else {

            echo "Looking good!";

            if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)){
                    echo "The file successfully ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
            } else {
                    echo "Sorry, there was a problem uploading your file.";
            }
    }
?>

我知道这个脚本可以正常工作,因为当使用基本的HTML表单时,它会正确地处理文件。然而,Qt方面的东西总是返回POST错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 03:26:06

问题是在网络上丢弃了数据包。上面的代码实际上是有效的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16735595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档