#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label->setScaledContents(true);
m_url="https://api-cn.faceplusplus.com/facepp/v3/detect";
m_apiKey="7kfC4-FHzEAIAJAebnnZT3YDSLfr7tiv";
// m_apiKey="api_key=ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W";
m_apiSecret="dWiiaWo2-n05KeAaCRPxsvjRvyZAVSrK";
// m_apiSecret="api_secret=hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N";
m_filePath="./1.jpg";
m_requestStr1="return_landmark=1";
m_requestStr1Ps="return_attributes=gender,age";
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->textBrowser->clear();
ui->label->setPixmap(QPixmap(m_filePath));
QFile file(m_filePath);
file.open(QIODevice::ReadOnly);
int file_len = file.size();
QDataStream in(&file);
char *m_buf = new char[file_len];
in.readRawData(m_buf, file_len);
file.close();
QByteArray arr = QByteArray(m_buf, file_len);
QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
QNetworkRequest request;
// 发送https请求前准备工作;
// QSslConfiguration config;
QSslConfiguration conf = QSslConfiguration::defaultConfiguration();
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
conf.setProtocol(QSsl::TlsV1SslV3);
request.setSslConfiguration(conf);
request.setUrl(QUrl(m_url));
QByteArray boundaryStr=getBoundary();
request.setRawHeader("Content-Type", "multipart/form-data; boundary="+boundaryStr);
//同上request.setHeader(QNetworkRequest::ContentTypeHeader,"multipart/form-data; boundary="+boundaryStr);//同样可行
// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded;charset=utf-8");
// request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0");
// request.setRawHeader("Connection","keep-alive");
// request.setRawHeader("Host","api-cn.faceplusplus.com");
//方式一:QHttpMultiPart
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
multiPart->setBoundary(boundaryStr);
QHttpPart key;
// key.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
key.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\""));
key.setBody("ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W");
QHttpPart secret;
secret.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_secret\""));
secret.setBody("hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N");
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image_base64\""));
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")/*QVariant("image/jpeg")*/);
imagePart.setBody(arr.toBase64());
imagePart.setBodyDevice(0);
QHttpPart landmark;
landmark.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"return_landmark\""));
landmark.setBody("1");
QHttpPart landmarktips;
landmarktips.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"return_attributes\""));
landmarktips.setBody("gender,age");
multiPart->append(key);
multiPart->append(secret);
multiPart->append(imagePart);
multiPart->append(landmark);
multiPart->append(landmarktips);
//方式二:拼串
QByteArray array;
// array.append("Content-Type:multipart/form-data; boundary="+boundaryStr/*分割串*/);
array.append("--"+boundaryStr+"\r\n");
array.append("Content-Disposition: form-data; name=\"api_key\"\r\n\r\n");
array.append("ISAO-PCspYGHS8C36AwY6WVj_5dhmf2W\r\n");
array.append("--"+boundaryStr+"\r\n");
array.append("Content-Disposition: form-data; name=\"api_secret\"\r\n\r\n");
array.append("hG0PG2R0BjCQ_RwJasQp73rYgvFA2Y6N\r\n");
array.append("--"+boundaryStr+"\r\n");
array.append("Content-Disposition: form-data; name=\"image_base64\"\r\nContent-Type:application/octet-stream\r\n\r\n");
//同上array.append("Content-Disposition: form-data; name=\"image_url\"\r\n\r\nhttps://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=581947021,421537588&fm=27&gp=0.jpg\r\n");
array.append(arr.toBase64()+"\r\n");
array.append("--"+boundaryStr+"\r\n");
array.append("Content-Disposition: form-data; name=\"return_landmark\"\r\n\r\n1\r\n");
array.append("--"+boundaryStr+"\r\n");
array.append("Content-Disposition: form-data; name=\"return_attributes\"\r\n\r\nemotion\r\n");
array.append("--"+boundaryStr+"--\r\n\r\n");//"--"important tail
// qDebug()<<array;
QNetworkReply *pReply = pManager->post(request,array/*multiPart*/);
connect(pReply , SIGNAL(finished()) , this , SLOT(onFinished()));
connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError(QNetworkReply::NetworkError)));
}
// 请求完成;
void Widget::onFinished()
{
qDebug()<<"successd";
QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
// 保存接受的数据;
QByteArray replyContent = pReplay->readAll();
ui->textBrowser->append(QString(replyContent));
pReplay->deleteLater();
}
// 请求失败;
void Widget::onError(QNetworkReply::NetworkError errorCode)
{
QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
// 输出错误码及错误信息;
qDebug()<< errorCode;
qDebug()<< pReplay->errorString();
ui->textBrowser->append(pReplay->errorString());
pReplay->deleteLater();
}
QByteArray Widget::getBoundary(){
QByteArray sb;
QByteArray tmp("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-");
for(int i = 0; i < 32; ++i) {
sb.append(tmp.at(qrand()%tmp.count()));
}
// sb.append("\r\n");
// int nnn=QDateTime::currentDateTime().toTime_t()*1000;
// QString n=QString::number(nnn,16);
qDebug()<<sb;
qDebug()<<sb.size();
return sb;
}