2010-04-13 14 views
7

Ich bin auf der Suche nach einem grundlegenden Code Beispiele zum Hochladen von Dateien auf Server mit HTTP POST-Methode auf Qt.Hochladen von Datei mit POST-Methode auf Qt4

Meine Aufgabe: Ich habe ein einfaches Qt-Programm und ich muss eine Bilddatei vom lokalen Host auswählen und auf den Server hochladen. Der Auswahlteil und die GUI sind einfach und ich habe es schon gemacht, aber mit POST-Upload bin ich verwirrt. Außerdem muss ich sagen, dass es keine Berechtigung zum Hochladen von Dateien gibt.

Wenn schon jemand dieses Thema sucht?

PS: der Grund, warum ich frage und nicht selbst programmieren ist Zeit, ich muss diese Methode schnell bekommen.

Danke, alle Erfolgslösungen von meiner Seite werden hier für andere veröffentlicht.

HINZUGEFÜGT: Hier ist mein Code, der noch nicht funktioniert. Upload-Website befindet sich here.

void CDialog::on_uploadButton_clicked() { 

    QFileInfo fileInfo(absPathLineEdit->text()); 

    if (!fileInfo.exists()) { 
     QMessageBox::information(this, 
      tr("Information"), 
      tr("File doesn't exists! Please, select another image.")); 
     return; 
    } 

    file = new QFile(fileInfo.filePath()); 
    if (!file->open(QIODevice::ReadOnly)) { 
     QMessageBox::information(this, 
      tr("Information"), 
      tr("Unable to open file for reading!")); 
     return; 
    } 

    QString host = "http://data.cod.ru"; 

    QUrl url(host); 

    QHttp::ConnectionMode mode = QHttp::ConnectionModeHttp; 
    http->setHost(url.host(), mode, (url.port() == -1) ? 80 : url.port()); 

    QHttpRequestHeader header("POST", "/", 1, 1); 
    header.setValue("Host", "data.cod.ru"); 
    header.setValue("Content-type", "multipart/form-data, boundary=AaB03x"); 
    header.setValue("Cache-Control", "no-cache"); 
    header.setValue("Accept", "*/*"); 

    QByteArray bytes(fileInfo.filePath().toUtf8()); 
    QByteArray totalBytes; 
    totalBytes.append("--AaB03x\r\n"); 
    totalBytes.append("Content-Disposition: form-data; name=\"email\"\r\n"); 
    totalBytes.append("\r\n"); 
    totalBytes.append("[email protected]\r\n"); 
    totalBytes.append("--AaB03x\r\n"); 
    totalBytes.append("Content-Disposition: form-data; name=\"photo\"; filename=\"" + bytes+ "\"\r\n"); 
    totalBytes.append("Content-Transfer-Encoding: binary\r\n\r\n"); 
    totalBytes.append(file->readAll()); 
    totalBytes.append("\r\n"); 
    totalBytes.append("--AaB03x--"); 

    header.setContentLength(totalBytes.length()); 

    httpRequestAborted = false; 
    httpGetId = http->request(header, totalBytes); 

    file->close(); 
} 

und Antwort lesen Funktion unten:

void CDialog::httpRequestFinished(int requestId, bool error) { 

    if (requestId != httpGetId) 
     return; 

    if (httpRequestAborted) { 
     if (file) { 
      file->close(); 
//   file->remove(); 
//   delete file; 
      file = 0; 
     } 
     return; 
    } 

    if (requestId != httpGetId) 
     return; 

    file->close(); 

    if (error) { 
//  file->remove(); 
     QMessageBox::information(this, tr("HTTP"), 
      tr("Download failed: %1.") 
      .arg(http->errorString())); 
    } else { 
     QByteArray data = http->readAll(); 
     QFile *dataFile = new QFile("answer.txt"); 
     dataFile->open(QIODevice::WriteOnly | QIODevice::Text); 
     dataFile->write(data); 
     dataFile->flush(); 
     dataFile->close(); 
    } 

// delete file; 
    file = 0; 
} 

Antwort

9

Auch fand ich heute schön Code: link text

Es ist Uploader/Download-App basierend auf Qt4, mit einem vollständigen Satz von POST-Header innerhalb von QNetworkAccessManager verwaltet, so für Anfänger wird es sehr hilfreich sein.

Besitzer: steif.ru

Committer: hoxnox

+0

Großartig! Konnte problemlos für das Hochladen in Flask-basierte App übernommen werden –

1

Verwendung QNetworkAccessManager.

manager.post(your_qhttpnetworkrequest, your_image_qfile); 
+0

@guruz: Danke, aber das ist nicht die Zielantwort ... – mosg

10

Ich sehe, Sie versuchen, QHTTP und QHttpRequestHeader Klassen zu verwenden. QT-Dokumentation besagt, dass diese veraltet sind:

Diese Klasse ist veraltet. Es wird zur Verfügung gestellt, damit der alte Quellcode funktioniert. Wir dringend davon abraten, es in neuen Code zu verwenden.

so, wie es vorher vorgeschlagen wurde; Ich würde empfehlen, QNetworkAccessManager für das zu verwenden, was Sie versuchen zu tun

wie für Ihre ursprüngliche Frage; Sie können QHTTP weiterhin zum Hochladen von Dateien verwenden. Ich glaube, dass die Struktur der tatsächlichen Anforderungsheader von der jeweiligen Site abhängt, auf die Sie zugreifen möchten. In diesem Fall wären Tools wie wireshark eine große Hilfe. Pls, überprüfen Sie, ob Code unten für Sie arbeiten würde, sollte es test1.jpg-Datei aus dem Basisordner hochladen und seinen Link auf dem Server ablegen, wenn 302 Antwort zurückgegeben wird.

void MainWindow::on_pushButton_clicked() 
{ 
    http = new QHttp(this); // http declared as a member of MainWindow class 
    connect(http, SIGNAL(requestFinished(int,bool)), SLOT(httpRequestFinished(int, bool))); 

    QString boundary = "---------------------------723690991551375881941828858"; 

    // action 
    QByteArray data(QString("--" + boundary + "\r\n").toAscii()); 
    data += "Content-Disposition: form-data; name=\"action\"\r\n\r\n"; 
    data += "file_upload\r\n"; 

    // file 
    data += QString("--" + boundary + "\r\n").toAscii(); 
    data += "Content-Disposition: form-data; name=\"sfile\"; filename=\"test1.jpg\"\r\n"; 
    data += "Content-Type: image/jpeg\r\n\r\n"; 

    QFile file("/home/test1.jpg"); 
    if (!file.open(QIODevice::ReadOnly)) 
     return; 

    data += file.readAll(); 
    data += "\r\n"; 

    // password 
    data += QString("--" + boundary + "\r\n").toAscii(); 
    data += "Content-Disposition: form-data; name=\"password\"\r\n\r\n"; 
    //data += "password\r\n"; // put password if needed 
    data += "\r\n"; 

    // description 
    data += QString("--" + boundary + "\r\n").toAscii(); 
    data += "Content-Disposition: form-data; name=\"description\"\r\n\r\n"; 
    //data += "description\r\n"; // put description if needed 
    data += "\r\n"; 

    // agree 
    data += QString("--" + boundary + "\r\n").toAscii(); 
    data += "Content-Disposition: form-data; name=\"agree\"\r\n\r\n"; 
    data += "1\r\n"; 

    data += QString("--" + boundary + "--\r\n").toAscii(); 

    QHttpRequestHeader header("POST", "/cabinet/upload/"); 
    header.setValue("Host", "data.cod.ru"); 
    header.setValue("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9"); 
    header.setValue("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    header.setValue("Accept-Language", "en-us,en;q=0.5"); 
    header.setValue("Accept-Encoding", "gzip,deflate"); 
    header.setValue("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
    header.setValue("Keep-Alive", "300"); 
    header.setValue("Connection", "keep-alive"); 
    header.setValue("Referer", "http://data.cod.ru/"); 

    //multipart/form-data; boundary=---------------------------723690991551375881941828858 

    header.setValue("Content-Type", "multipart/form-data; boundary=" + boundary); 
    header.setValue("Content-Length", QString::number(data.length())); 

    http->setHost("data.cod.ru"); 
    http->request(header, data); 

    file.close(); 
} 

void MainWindow::httpRequestFinished(int, bool) 
{ 
    QHttpResponseHeader responce = http->lastResponse(); 
    if (responce.statusCode()==302) 
    { 
     qDebug() << "file accepted; get it from:"; 
     qDebug() << "data.cod.ru" << responce.value("Location"); 
    } 
} 

httpRequestFinished in den Signalen Abschnitt der Mainwindow-Klasse deklariert

hoffe, das hilft, Liguster;)

+1

@serge_gubenko: Vielen Dank und viel Glück. Dieser Code hat für mich funktioniert! :) Спасибо! – mosg

-2
QPixmap pix(path); 
QByteArray bytes, data; 
QBuffer buffer(&bytes); 
if(!buffer.open(QIODevice::WriteOnly)) { 
    return; 
} 

pix.save(&buffer, "JPG"); 

data.append ("Content-Disposition: form-data; name = \" photo \ "; filename = \" - \ "\ r \ n") ; data.append ("Inhaltstyp: image/jpg \ r \ n \ r \ n"); //data.append("Content-Transfer-Encoding: binary \ r \ n "); data.append (Bytes); data.append ("\ r \ n"); data.append ("- Asrf456BGe4h \ r \ n");