Qt如何上传zip文件

1、文件流形式上传zip文件

[cpp] view plain copy
 print?
  1. <span style="font-size:18px;">void SNetWork::uploadFile(QString filePath, QByteArray rand, QByteArray dateTime)  
  2. {  
  3.     QFile file(filePath);  
  4.     file.open(QIODevice::ReadOnly);  
  5.     QByteArray data = file.readAll();  
  6.     file.close();  
  7.     m_requestGetEquipmentStatus->setUrl(QUrl(PRODUCT_UPLOAD));  
  8.     m_requestGetEquipmentStatus->setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");  
  9.     QByteArray rand_array = QCryptographicHash::hash(rand+"mac|2017", QCryptographicHash::Sha1).toHex().toUpper();  
  10.     QByteArray key_array = QCryptographicHash::hash(dateTime +"-ev|"+rand_array, QCryptographicHash::Sha256).toHex().toLower();  
  11.     m_requestGetEquipmentStatus->setRawHeader("t", dateTime);  
  12.     m_requestGetEquipmentStatus->setRawHeader("salt", rand);  
  13.     m_requestGetEquipmentStatus->setRawHeader("key", key_array);  
  14.     QNetworkReply* m_netReply = m_manager->post(*m_requestGetEquipmentStatus, data.toBase64());  // 这里是把文件转成base64的,好处是,防止文件传的过程因为符号,空格的原因,导致文件数据失真。  
  15.     connect(m_netReply, &QNetworkReply::uploadProgress, [=](qint64 a,qint64 b){  
  16.         qDebug() << "m_netReply uploadProgress" << a << b;  
  17.     });  
  18.     connect(m_netReply, &QNetworkReply::finished, [=](){  
  19.         qDebug() << "m_netReply finished";  
  20.     });  
  21. }</span>  

2、表单形式上传zip文件

[cpp] view plain copy
 print?
  1. void SNetWork::uploadFile(QString filePath, QByteArray rand, QByteArray dateTime)  
  2. {  
  3.     QFile file(filePath);  
  4.     file.open(QIODevice::ReadOnly);  
  5.     QByteArray data = file.readAll();  
  6.     QFileInfo fineInfo(file);  
  7.     QString fileName = fineInfo.fileName();  
  8.     file.close();  
  9.     QString boundary = "----weasdashDsdesd";  
  10.     QString startBoundary = "--" + boundary; //起始边界  
  11.     QString endBoundary = "\r\n--" + boundary + "--\r\n";  //结束边界  
  12.     QString qContentType = "multipart/form-data; boundary=" + boundary; //设置传输类型  
  13.     QByteArray content;  
  14.     QString tempStr = startBoundary;  
  15.     tempStr += "\r\nContent-Disposition: form-data; name=\"data\"; filename=\""+fileName+"\"\r\n";  
  16.     tempStr += "Content-Type: application/zip \r\n\r\n";  
  17.     content.append(tempStr.toLatin1());  
  18.     content.append(data);  
  19.     content.append(endBoundary);  
  20.     m_requestGetEquipmentStatus->setUrl(QUrl(PRODUCT_UPLOAD));  
  21.     m_requestGetEquipmentStatus->setHeader(QNetworkRequest::ContentTypeHeader, qContentType);  
  22.     QByteArray rand_array = QCryptographicHash::hash(rand+"mac|2017", QCryptographicHash::Sha1).toHex().toUpper();  
  23.     QByteArray key_array = QCryptographicHash::hash(dateTime +"-ev|"+rand_array, QCryptographicHash::Sha256).toHex().toLower();  
  24.     m_requestGetEquipmentStatus->setRawHeader("t", dateTime);  
  25.     m_requestGetEquipmentStatus->setRawHeader("salt", rand);  
  26.     m_requestGetEquipmentStatus->setRawHeader("key", key_array);  
  27.     QNetworkReply* m_netReply = m_manager->post(*m_requestGetEquipmentStatus, content);  
  28.     connect(m_netReply, &QNetworkReply::uploadProgress, [=](qint64 a,qint64 b){  
  29.         qDebug() << "m_netReply uploadProgress" << a << b;  
  30.     });  
  31.     connect(m_netReply, &QNetworkReply::finished, [=](){  
  32.         qDebug() << "m_netReply finished";  
  33.     });  
  34. }  


注意第二种以表单(报表)形式上传zip文件的方式比较特殊,文中的boundary 值最好是随机生成的,我只是随便举了一个小例子。下面附一个随机生成字符串的例子:

[cpp] view plain copy
 print?
  1. QString setRandStr(int strLen)  
  2. {  
  3.     QString tmp = QString("0123456789ABCDEFGHIJKLMNOPQRSTUVWZYZ");  
  4.     QString str = QString();  
  5.     QTime t = QTime::currentTime();  
  6.     qsrand(t.msec()+t.second()*1000);  
  7.     for(int i=0 ; i<strLen; i++) {  
  8.         int ir = qrand()%tmp.length();  
  9.         str[i] = tmp.at(ir);  
  10.     }  
  11.     return str;  
  12. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值