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.
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
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