1
1
#include " httpclient.hpp"
2
2
3
3
#include < QEventLoop>
4
- #include < QFile>
4
+ #include < QFileInfo>
5
+ #include < QHttpMultiPart>
5
6
#include < QJsonDocument>
6
7
#include < QJsonObject>
7
8
#include < QPointer>
@@ -168,7 +169,7 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
168
169
const QByteArray fromRange = " bytes=" + QByteArray::number (bytes) + " -" ;
169
170
request.setRawHeader (" Range" , fromRange);
170
171
}
171
- qDebug () << QString (" Download: %-1 >%2" ).arg (url.toString (QUrl::RemoveUserInfo), filePath);
172
+ qDebug () << QString (" Download: %1- >%2" ).arg (url.toString (QUrl::RemoveUserInfo), filePath);
172
173
173
174
auto *reply = QNetworkAccessManager::get (request);
174
175
d_ptr->downloads
@@ -187,16 +188,17 @@ QNetworkReply *HttpClient::downLoad(const QUrl &url,
187
188
return reply;
188
189
}
189
190
190
- QNetworkReply *HttpClient::upload (const QUrl &url,
191
- const QString &filePath,
192
- int timeout,
193
- bool verifyCertificate,
194
- CallBack callBack)
191
+ QNetworkReply *HttpClient::upload_put (const QUrl &url,
192
+ const QString &filePath,
193
+ int timeout,
194
+ bool verifyCertificate,
195
+ CallBack callBack)
195
196
{
196
197
Q_ASSERT (!filePath.isEmpty ());
197
198
auto *file = new QFile (filePath, this );
198
199
if (!file->open (QIODevice::ReadOnly)) {
199
200
qWarning () << QString (" Cannot open the file: %1!" ).arg (filePath) << file->errorString ();
201
+ file->deleteLater ();
200
202
return nullptr ;
201
203
}
202
204
qDebug () << QString (" Upload: %1->%2" ).arg (filePath, url.toString (QUrl::RemoveUserInfo));
@@ -206,35 +208,78 @@ QNetworkReply *HttpClient::upload(const QUrl &url,
206
208
auto *reply = QNetworkAccessManager::put (request, file);
207
209
file->setParent (reply);
208
210
d_ptr->uploads .insert (reply, file);
209
- d_ptr->tasks .insert (reply, callBack);
210
- connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
211
- connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
212
- connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
213
- if (timeout > 0 ) {
214
- auto *timer = new QTimer (reply);
215
- connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
216
- timer->start (timeout * 1000 );
217
- }
211
+ connectUploadSlots (reply, timeout, callBack);
218
212
return reply;
219
213
}
220
214
221
- QNetworkReply *HttpClient::upload (
215
+ QNetworkReply *HttpClient::upload_put (
222
216
const QUrl &url, const QByteArray &data, int timeout, bool verifyCertificate, CallBack callBack)
223
217
{
224
218
qDebug () << QString (" Upload To %1" ).arg (url.toString (QUrl::RemoveUserInfo));
225
219
226
220
auto request = d_ptr->networkRequest (verifyCertificate);
227
221
request.setUrl (url);
228
222
auto *reply = QNetworkAccessManager::put (request, data);
229
- d_ptr->tasks .insert (reply, callBack);
230
- connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
231
- connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
232
- connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
233
- if (timeout > 0 ) {
234
- auto *timer = new QTimer (reply);
235
- connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
236
- timer->start (timeout * 1000 );
223
+ connectUploadSlots (reply, timeout, callBack);
224
+ return reply;
225
+ }
226
+
227
+ QNetworkReply *HttpClient::upload_post (const QUrl &url,
228
+ const QString &filePath,
229
+ int timeout,
230
+ bool verifyCertificate,
231
+ CallBack callBack)
232
+ {
233
+ Q_ASSERT (!filePath.isEmpty ());
234
+ auto *file = new QFile (filePath, this );
235
+ if (!file->open (QIODevice::ReadOnly)) {
236
+ qWarning () << QString (" Cannot open the file: %1!" ).arg (filePath) << file->errorString ();
237
+ file->deleteLater ();
238
+ return nullptr ;
237
239
}
240
+ auto filename = QFileInfo (filePath).fileName ();
241
+ qDebug () << QString (" Upload: %1->%2" )
242
+ .arg (filePath, url.toString (QUrl::RemoveUserInfo) + " /" + filename);
243
+
244
+ auto disposition = QString (" form-data; name=\" %1\" ; filename=\" %2\" " ).arg (" file" , filename);
245
+ QHttpPart filePart;
246
+ filePart.setHeader (QNetworkRequest::ContentDispositionHeader, QVariant (disposition));
247
+ filePart.setBodyDevice (file);
248
+ auto *multiPart = new QHttpMultiPart (QHttpMultiPart::FormDataType);
249
+ multiPart->append (filePart);
250
+
251
+ auto request = d_ptr->networkRequest (verifyCertificate);
252
+ request.setUrl (url);
253
+
254
+ auto *reply = QNetworkAccessManager::post (request, multiPart);
255
+ file->setParent (reply);
256
+ multiPart->setParent (reply);
257
+ d_ptr->uploads .insert (reply, file);
258
+ connectUploadSlots (reply, timeout, callBack);
259
+ return reply;
260
+ }
261
+
262
+ QNetworkReply *HttpClient::upload_post (const QUrl &url,
263
+ const QString &filename,
264
+ const QByteArray &data,
265
+ int timeout,
266
+ bool verifyCertificate,
267
+ CallBack callBack)
268
+ {
269
+ qDebug () << QString (" Upload To %1" ).arg (url.toString (QUrl::RemoveUserInfo) + " /" + filename);
270
+ auto disposition = QString (" form-data; name=\" %1\" ; filename=\" %2\" " ).arg (" file" , filename);
271
+ QHttpPart filePart;
272
+ filePart.setHeader (QNetworkRequest::ContentDispositionHeader, QVariant (disposition));
273
+ filePart.setBody (data);
274
+ auto *multiPart = new QHttpMultiPart (QHttpMultiPart::FormDataType);
275
+ multiPart->append (filePart);
276
+
277
+ auto request = d_ptr->networkRequest (verifyCertificate);
278
+ request.setUrl (url);
279
+
280
+ auto *reply = QNetworkAccessManager::post (request, multiPart);
281
+ multiPart->setParent (reply);
282
+ connectUploadSlots (reply, timeout, callBack);
238
283
return reply;
239
284
}
240
285
@@ -368,6 +413,19 @@ QJsonObject HttpClient::hookResult(const QJsonObject &object)
368
413
return object;
369
414
}
370
415
416
+ void HttpClient::connectUploadSlots (QNetworkReply *reply, int timeout, CallBack callBack)
417
+ {
418
+ d_ptr->tasks .insert (reply, callBack);
419
+ connect (reply, &QNetworkReply::errorOccurred, this , &HttpClient::onErrorOccurred);
420
+ connect (reply, &QNetworkReply::sslErrors, this , &HttpClient::onSslErrors);
421
+ connect (reply, &QNetworkReply::finished, this , &HttpClient::onUploadFinish);
422
+ if (timeout > 0 ) {
423
+ auto *timer = new QTimer (reply);
424
+ connect (timer, &QTimer::timeout, this , &HttpClient::onNetworkTimeout);
425
+ timer->start (timeout * 1000 );
426
+ }
427
+ }
428
+
371
429
void HttpClient::queryResult (QNetworkReply *reply, const QJsonObject &object)
372
430
{
373
431
qDebug () << object;
0 commit comments