2013-06-21 9 views
6

Sto lavorando in Qt 5 e sto lottando con un caricamento multipart. Il mio script è il più vicino al docs possibile:QHttpMultiPart: invia file allo script 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))); 

poi la mia fessura uploadReply() si limita a stampare la risposta:

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

ho fatto lo script di upload è il più semplice possibile e funzionante in XAMPP con Apache/2.2.21 e PHP 5.3.8. Il mio upload_max_filesize e post_max_size sono 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']; 

il mio spazio di avanzamento mostra approssimativamente il numero corretto di byte caricati.

ma gli spettacoli di uscita:

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

Sembra che i byte vengono presentate da $ _POST variabile piuttosto che un $ _File come dovrebbero essere? Non ci sono errori nel registro di apache. Come posso eseguire il debug di questo?

risposta

8

Risolto!

Grazie a this question per il suggerimento - Ho aggiunto "nome file" alla disposizione del contenuto per QHttpPart e ora viene caricato come previsto. Pensavo che il nome del file fosse opzionale ma sembra funzionare in questo caso. Spero che questo aiuti qualcun altro!

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

mio PHP dice: '' 'Avviso relativo alla mancanza di confine nei dati multipart/form-data POST in Unknown on line 0''' C'è un modo per eseguire il debug di questo? –