2013-05-24 17 views
9

Mam problemy z przesyłaniem plików na serwer za pomocą QNetworkRequest. Używałem tego linku (http://qt-project.org/forums/viewthread/11361) głównie jako szablonu, ale nadal otrzymuję błędy POST (203). Oto, co mam do tej pory.Przesyłanie plików przy użyciu 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; 
} 

Oto skrypt na serwerze, aby przetworzyć plik:

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

wiem, że skrypt działa, jak to będzie przetwarzał zbiór poprawnie przy użyciu podstawowego formularza HTML. Jednak strona Qt zawiera powtarzające się błędy POST.

+3

Można to oznaczyć jako rozwiązane. Najwyraźniej problem nie dotyczył mojego kodu, ale połączenia sieciowego zrzucającego pakiety. Powyższy kod faktycznie działa dla danego zadania, więc jeśli ktoś natknie się na to przez Google, to zadziała. – FMDragon

+0

Następnie proponuję, abyś umieścił [SOLVED] w tytule pytania lub napisał odpowiedź na to pytanie (biorąc pod uwagę tradycję SO, lepiej zrób to drugie). – Momergil

Odpowiedz

2

Problem polegał na porzuceniu pakietów w sieci. Powyższy kod faktycznie działa.

Powiązane problemy