使用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 });