2013-05-24 13 views
9

Ho riscontrato alcuni problemi nel tentativo di caricare file su un server utilizzando QNetworkRequest. Sto usando questo link (http://qt-project.org/forums/viewthread/11361) principalmente come modello, ma sto ancora ricevendo errori POST (203 per essere specifici). Ecco cosa ho finora.Caricamento di file tramite 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; 
} 

Ecco lo script sul server per elaborare il 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."; 
      } 
    } 
?> 

So che lo script funziona, in quanto consente di gestire il file in modo corretto quando si utilizza un modulo HTML di base. Tuttavia, il lato Qt delle cose continua a restituire errori POST.

+3

Questo può essere contrassegnato come risolto. Apparentemente il problema non era con il mio codice, ma con la connessione di rete che perdeva i pacchetti. Il codice sopra in realtà funziona per l'attività in corso, quindi se qualcuno dovesse imbattersi in questo tramite Google, funzionerà. – FMDragon

+0

Quindi ti suggerisco di mettere un [SOLVED] nel titolo della domanda o scrivere una risposta ad esso (date le tradizioni di SO, meglio fare il secondo). – Momergil

risposta

2

Il problema era la perdita di pacchetti sulla rete. Il codice sopra funziona davvero.