2013-05-24 1 views
9

Ich habe einige Probleme beim Hochladen von Dateien auf einen Server mit QNetworkRequest. Ich habe diesen Link (http://qt-project.org/forums/viewthread/11361) hauptsächlich als Vorlage verwendet, erhalte aber immer noch POST-Fehler (203, um genau zu sein). Hier ist was ich bisher habe.Hochladen von Dateien mit Qt QNetworkRequest

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

Hier ist das Skript auf dem Server die Datei zu verarbeiten:

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

Ich weiß, dass das Skript funktioniert, wie es die Datei ordnungsgemäß zu behandeln, wenn ein grundlegendes HTML-Formular. Die Qt-Seite der Dinge führt jedoch immer wieder POST-Fehler zurück.

+3

Dies kann als gelöst markiert werden. Anscheinend lag das Problem nicht an meinem Code, sondern daran, dass die Netzwerkverbindung Pakete fallen ließ. Der obige Code funktioniert tatsächlich für die vorliegende Aufgabe. Wenn also jemand über Google darauf stolpert, wird dies funktionieren. – FMDragon

+0

Dann würde ich vorschlagen, dass Sie entweder einen [gelöst] in den Titel der Frage stellen oder eine Antwort darauf schreiben (SO Traditionen gegeben, besser die zweite). – Momergil

Antwort

2

Problem wurde Pakete im Netzwerk fallen gelassen. Der obige Code funktioniert tatsächlich.