QT4

2010-04-13 11 views
7

पर POST विधि के साथ फ़ाइल अपलोड करें मैं Qt पर HTTP POST विधि के साथ सर्वर पर फ़ाइलों को अपलोड करने के तरीके के मूल कोड नमूने की तलाश में हूं।QT4

मेरा कार्य: मेरे पास सरल क्यूटी प्रोग्राम है और मुझे स्थानीय होस्ट से किसी भी छवि फ़ाइल का चयन करने और सर्वर पर अपलोड करने की आवश्यकता है। चयन भाग और जीयूआई सरल है और मैंने इसे पहले ही कर लिया है, लेकिन पोस्ट अपलोड के साथ मैं उलझन में हूं। इसके अलावा मुझे कहना है कि फ़ाइल अपलोड करने के लिए कोई प्राधिकरण नहीं है।

यदि कोई पहले से ही इस विषय को देख रहा है?

पीएस: कारण मैं क्यों पूछ रहा हूं और स्वयं को कोडिंग नहीं कर रहा हूं, मुझे यह विधि जल्दी से प्राप्त करने की आवश्यकता है।

धन्यवाद, मेरी तरफ से सभी सफल समाधान दूसरों के लिए यहां पोस्ट किए जाएंगे।

जोड़ा गया: यहां मेरा कोड है, जो अभी तक काम नहीं करता है। 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(); 
} 

और पढ़ने के जवाब नीचे समारोह:

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

उत्तर

9

इसके अलावा, मैं आज अच्छा कोड मिला: link text

यह अपलोड करने वाले/डाउनलोडर अनुप्रयोग है QNetworkAccessManager द्वारा प्रबंधित पोस्ट हेडर के पूर्ण सेट के साथ Qt4 पर आधारित, इसलिए शुरुआती लोगों के लिए यह बहुत उपयोगी होगा।

स्वामी: कठोर।आरयू

committer: hoxnox

+0

बढ़िया! फ्लास्क-आधारित ऐप पर अपलोड करने के लिए आसानी से अपनाया जा सकता है –

1

उपयोग QNetworkAccessManager।

manager.post(your_qhttpnetworkrequest, your_image_qfile); 
+0

@guruz: धन्यवाद, लेकिन यह लक्ष्य का जवाब नहीं है ... – mosg

10

मुझे लगता है कि आप QHTTP और QHttpRequestHeader कक्षाओं का उपयोग करने का प्रयास कर रहे हैं। क्यूटी दस्तावेज का कहना है कि उनको बहिष्कृत किया गया है:

यह कक्षा अप्रचलित है। पुराने स्रोत कोड को काम करने के लिए इसे प्रदान किया जाता है। हम नया कोड में इसका उपयोग करने के खिलाफ दृढ़ता से सलाह देते हैं।

, जैसा कि पहले बताया गया था; मैं QNetworkAccessManager का उपयोग करने की सलाह दूंगा जो आप

को अपने मूल प्रश्न के लिए करने की कोशिश कर रहे हैं; आप अभी भी फाइल अपलोड करने के लिए QHTTP का उपयोग कर सकते हैं; मेरा मानना ​​है कि वास्तविक अनुरोध शीर्षलेख संरचना उस विशेष साइट पर निर्भर करती है जिसे आप एक्सेस करने का प्रयास कर रहे हैं। इस मामले में wireshark जैसे टूल बहुत मददगार होंगे। कृपया, जांचें कि नीचे दिया गया कोड आपके लिए काम करेगा या नहीं, इसे होम फोल्डर से test1.jpg फ़ाइल अपलोड करनी चाहिए और 302 प्रतिक्रिया लौटाए जाने पर सर्वर पर अपना लिंक डंप करना चाहिए। ;

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 MainWindow वर्ग

आशा है कि यह मदद करता है, Privet के संकेतों अनुभाग में घोषित)

+1

@serge_gubenko: बहुत बहुत धन्यवाद और शुभकामनाएं। यह कोड मेरे लिए काम किया! :) Спасибо! – mosg

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

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

data.append ("सामग्री-विन्यास: फार्म डेटा, नाम = \" तस्वीर \ "; फ़ाइल नाम = \" - \ "\ r \ n") ; data.append ("सामग्री-प्रकार: छवि/jpg \ r \ n \ r \ n"); //data.append("Content- ट्रांसफर- एन्कोडिंग: बाइनरी \ r \ n "); डेटा.एपेंड (बाइट्स); data.append ("\ r \ n"); data.append ("- Asrf456BGe4h \ r \ n");

संबंधित मुद्दे