Qt(前端界面)中上傳文件


使用http協議中post請求方式上傳數據通常使用“multipart/form-data”,一個完整的文件上傳post請求如下:

 

 1 POST http://www.example.com HTTP/1.1 
 2 #以表單方式上傳文件
 3 Content-Type: multipart/form-data 
 4 # 發送的數據 
 5 ------WebKitFormBoundaryPpL3BfPQ4cHShsBz 
 6 \r\n 
 7 Content-Disposition: form-data; name="file"; filename="qw.png";  
 8 #上傳的文件類型,注意與上面“content-type”區別
 9 Content-Type: image/png\r\n; 
10 \r\n 
11 .............文件內容................ 
12 .............文件內容................ 
13 ------WebKitFormBoundaryPpL3BfPQ4cHShsBz

 

請求行(第一行)和請求頭(第三行)可通過QNetworkRequest類組織,“content-disposition”、“content-type”、“文件真正內容”可通過QHttpPart類組織,QHttpMultiPart類負責組織第五行至第十三行。

上代碼,陰影部分對應:

 1 void MainWindow::on_uploadBtn_clicked()
 2 {
 3     // 1. 創建networkmanager對象
 4     QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
 5     // 2. 發送數據 - post
 6     QNetworkRequest request;
 7     request.setUrl(QUrl("http://192.168.31.119:80/myupload"));
 8     request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
 9 
10     // post數據塊
11     QFileInfo info(ui->filePath->text());
12     QHttpPart part;
13     QString disp = QString("form-data; user=\"%1\"; filename=\"%2\")
14             .arg(xx).arg(xx);
15     QString sufix = info.suffix();
16     //組織content-dispositon
17     part.setHeader(QNetworkRequest::ContentDispositionHeader, disp);
18     QFile *file = new QFile(ui->filePath->text());
19     file->open(QFile::ReadOnly);
20     //組織真正文件內容
21     part.setBodyDevice(file);
22     // 傳輸的數據塊的格式
23     /*  json配置文件
24         {
25             ".mp3":"audio/mp3",
26             ".avi":"video/avi",
27             ".html":"text/html",
28             ".json":"application/json"
29         }
30     */
31    //組織content -type 第九行
32     part.setHeader(QNetworkRequest::ContentTypeHeader, "xxxx"); 
33     
34     QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType, this);
35     //加上分界線,打包
36     multiPart->append(part);
37     //post方式發送出去
38     QNetworkReply* reply = pManager->post(request, multiPart /*QHttpMultiPart *multiPart*/);
39     connect(reply, &QNetworkReply::readyRead, this, [=](){
40         //  接收數據
41         QByteArray all = reply->readAll();
42       
43 
44         // 釋放內存
45         // delete multiPart;
46         multiPart->deleteLater();
47         file->close();
48         file->deleteLater();
49         reply->deleteLater();
50     }); 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM