2013-06-21 12 views
6

Pracuję w Qt 5 i walczę z przesyłaniem wieloczęściowym. Mój skrypt jest tak blisko do docs jak to możliwe:QHttpMultiPart: pliki pocztowe do skryptu PHP

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

wtedy moja() Gniazdo uploadReply tylko wypisuje odpowiedź:

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

zrobiłem skrypt wysyłania jest tak proste, jak to możliwe i działa w XAMPP z Apache/2.2.21 i PHP 5.3.8. Moje upload_max_filesize i post_max_size to 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']; 

Moje gniazdo postępu pokazuje mniej więcej poprawną liczbę przesłanych bajtów.

ale pokazuje wyjściowe:

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

Wygląda bajtów składane są jako zmienna $ _POST zamiast $ _FILE jak powinno być? W dzienniku apache nie ma błędu. Jak mogę to debugować?

Odpowiedz

8

Rozwiązany!

Dzięki this question za podpowiedź - dodałem "nazwę pliku" do dyspozycji treści dla QHttpPart i teraz jest przesyłane zgodnie z oczekiwaniami. Myślałem, że nazwa pliku jest opcjonalna, ale wydaje się działać w tym przypadku. Mam nadzieję, że to pomoże komuś innemu!

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

Mój PHP mówi: '' 'Ostrzeżenie: Brakująca granica w wieloczęściowej/formularzowej danych Dane POST w Nieznane w linii 0''' Czy istnieje sposób debugowania tego? –