2013-06-21 13 views
6

Ich arbeite in Qt 5 und kämpft mit einem mehrteiligen Upload. Mein Skript ist so nah an der docs wie möglich:QHttpMultiPart: Post-Dateien in PHP-Skript

QUrl testUrl("http://localhost/upload/test.php"); 
QNetworkRequest request(testUrl); 


QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); 

QString preview_path = "C:/preview.jpg"; 
QHttpPart previewPathPart; 
previewPathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_path\"")); 
previewPathPart.setBody(preview_path.toLatin1()); 

QHttpPart previewFilePart; 
previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); 
previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"")); 
QFile *file = new QFile(preview_path); 

if (!file->exists()) { 
    emit error(tr("Upload Error. File does not exist: ") + preview_path); 
    return; 
} 
file->open(QIODevice::ReadOnly); 
previewFilePart.setBodyDevice(file); 
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart 

multiPart->append(previewPathPart); 
multiPart->append(previewFilePart); 

reply = networkManager->post(request, multiPart); 
multiPart->setParent(reply); // delete the multiPart with the reply 

connect(reply, SIGNAL(finished()), 
      this, SLOT (uploadReply())); 

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), 
      this, SLOT (uploadError(QNetworkReply::NetworkError))); 

connect(reply, SIGNAL(uploadProgress(qint64, qint64)), 
      this, SLOT (uploadProgress(qint64, qint64))); 

dann meine uploadReply() Slot druckt nur die Antwort:

QString data = (QString) reply->readAll(); 
qDebug() << data; 

ich die Upload-Skript gemacht haben, ist so einfach wie möglich und läuft in XAMPP mit Apache/2.2.21 und PHP 5.3.8. Meine upload_max_filesize und post_max_size sind 1000M.

echo "preview_path: " . (isset($_POST['preview_path']) ? $_POST['preview_path'] : "not set") . "\r\n"; 
echo "preview_file exists: " . (isset($_POST['preview_file']) ? "true" : "false"). "\r\n"; 
echo '$_FILES: '; 
print_r($_FILES); 
echo "preview_file content: " . $_POST['preview_file']; 

Mein Fortschrittsfenster zeigt die ungefähre korrekte Anzahl von Bytes, die hochgeladen werden.

Aber die Ausgabe zeigt:

preview_path: C:/preview.jpg 
preview_file exists: true 
$_FILES: Array 
(
) 
preview_file content: ???? 

Es scheint, wie die Bytes werden als $ _POST Variable vorgelegt und nicht als $ _file wie sie sein sollten? Es gibt keinen Fehler im Apache-Protokoll. Wie kann ich das debuggen?

Antwort

8

Gelöst!

Dank this question für den Hinweis - Ich habe "Dateiname" zur Inhaltsdisposition für die QHttpPart hinzugefügt und es wird jetzt wie erwartet hochgeladen. Ich dachte Dateiname war optional, scheint aber in diesem Fall zu funktionieren. Hoffe das hilft jemand anderem!

QString preview_name = "preview.jpg"; 

QHttpPart previewFilePart; 
previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); 
previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ preview_name + "\"")); 
+1

Mein PHP sagt dies: '' 'Warnung: Fehlende Grenze in multipart/form-Daten POST-Daten in Unknown on line 0''' Gibt es eine Möglichkeit, dies zu debuggen? –