使用Qt QNetworkRequest上传文件 [英] Uploading files using Qt QNetworkRequest

查看:610
本文介绍了使用Qt QNetworkRequest上传文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用QNetworkRequest将文件上传到服务器。我一直在使用这个链接( http://qt-project.org/forums/viewthread/11361 )主要是作为一个模板,但我仍然得到POST错误(203具体)。这是我到目前为止。

pre $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ QByteArray postData ;
//在下面查看buildUploadString()函数
postData = mReport-> buildUploadString();

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


QString bound =margin; //边界名称

QNetworkRequest请求(mResultsURL); //我们的服务器用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(已完成(QNetworkReply *)),this,SLOT(printScriptReply(QNetworkReply *))); //这个槽用于调试服务器脚本的输出
mNetworkManager-> post(request,postData);


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


QString bound =margin;
QByteArray数据(QString( - + bound +\r\\\
)。toAscii());
data.append(Content-Disposition:form-data; name = \action \\r\\\
\r\\\
);
data.append(uploadFile.php \r\\\
);
data.append(QString( - + bound +\r\\\
)。toAscii());
data.append(Content-Disposition:form-data; name = \uploaded\; filename = \);
data.append(getReportFileName());
data.append(\\r\\\
);
data.append(Content-Type:text / xml\r\\\
\r\\\
); //数据类型

QFile文件(路径);
if(!file.open(QIODevice :: ReadOnly)){
qDebug()<< QFile错误:找不到文件!;
返回数据;
} else {qDebug()<< 找到文件,按计划进行; }

data.append(file.readAll());
data.append(\r\\\
);
data.append( - + bound +--\r\\\
); //根据rfc关闭边界1867


file.close();

返回数据;

$ / code>

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


$ b $

 <?php 

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

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

echotarget:;
echo $ target;

//这是我们的限制文件类型条件
if($ uploaded_type ==text / xml){
echo我们有一个xml文件!\r\\ \
;
}

//这里我们检查$ ok没有被设置为0的错误
//如果一切正常,我们尝试上传
if( $ ok == 0){

回声对不起,您的文件没有上传;

} else {

echo看起来不错!;

if(move_uploaded_file($ _ FILES ['uploaded'] ['tmp_name'],$ target)){
echoThe file successfully。 basename($ _FILES ['uploadedfile'] ['name'])。 已上传;
} else {
echo抱歉,上传文件时出现问题。
}
}
?>

我知道脚本能够正常工作,因为它在使用基本的HTML表单时会正确处理文件。不过,Qt方面的东西总是返回POST错误。

解决方案

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


I've been having some issues trying to upload files to a server using QNetworkRequest. I've been using this link (http://qt-project.org/forums/viewthread/11361) mostly as a template, but am still getting POST errors (203 to be specific). Here is what I have so far.

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

Here is the script on the server to process the file:

<?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.";
            }
    }
?>

I know that the script works, as it will handle the file properly when using a basic HTML form. However, the Qt side of things keeps returning POST errors.

解决方案

Problem was dropped packets on the network. The above code actually works.

这篇关于使用Qt QNetworkRequest上传文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆