25#include <QHttpMultiPart>
26#include <QNetworkAccessManager>
27#include <QNetworkReply>
28#include <QNetworkRequest>
30#include <qmimedatabase.h>
32#include "moc_qgsfileuploader.cpp"
34using namespace Qt::StringLiterals;
38 , mFormName( formName )
39 , mUploadCanceled( false )
41 if ( !uploadFileName.isEmpty() )
42 mFile.setFileName( uploadFileName );
54 QNetworkRequest request( mUrl );
56 if ( !mAuthCfg.isEmpty() )
62 auto multiPart = std::make_unique<QHttpMultiPart>( QHttpMultiPart::FormDataType );
65 auto file = std::make_unique<QFile>( mFile.fileName() );
66 QFileInfo fi = QFileInfo( file->fileName() );
69 QMimeType mimeType = db.mimeTypeForFile( file->fileName() );
71 filePart.setHeader( QNetworkRequest::ContentTypeHeader, mimeType.name() );
72 filePart.setHeader( QNetworkRequest::ContentDispositionHeader, u
"form-data; %1filename=\"%2\""_s.arg( ( mFormName.isEmpty() ) ? QString(
"" ) : u
"name=\"%1\"; "_s.arg( mFormName ), fi.fileName() ) );
73 if ( !file->open( QIODevice::ReadOnly ) )
75 error( tr(
"Error reading file %1" ).arg( mFile.fileName() ) );
79 filePart.setBodyDevice( file.get() );
80 file.release()->setParent( multiPart.get() );
82 multiPart->append( filePart );
87 if ( !mAuthCfg.isEmpty() )
105 error( tr(
"Network request %1 timed out" ).arg( networkRequest->
errorMessage() ) );
109 error( tr(
"Upload failed, Server returned: %1" ).arg( networkRequest->
errorMessage() ) );
113 error( tr(
"Upload failed: %1" ).arg( networkRequest->
errorMessage() ) );
117 networkRequest->deleteLater();
122 mUploadCanceled =
true;
128void QgsFileUploader::error(
const QStringList &errorMessages )
130 for (
const QString &error : errorMessages )
136void QgsFileUploader::error(
const QString &errorMessage )
138 error( QStringList() << errorMessage );
142void QgsFileUploader::onFinished()
145 if ( !mErrors.isEmpty() || mUploadCanceled )
147 if ( mFile.isOpen() )
153 if ( mFile.isOpen() )
168void QgsFileUploader::onUploadProgress( qint64 bytesSent, qint64 bytesTotal )
170 if ( mUploadCanceled )
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
bool updateNetworkRequest(QNetworkRequest &request, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkRequest with an authentication config.
A thread safe class for performing blocking (sync) network requests, with full support for QGIS proxy...
void uploadProgress(qint64 bytesReceived, qint64 bytesTotal)
Emitted when when data are sent during a request.
void abort()
Aborts the network request immediately.
ErrorCode post(QNetworkRequest &request, QIODevice *data, bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Performs a "post" operation on the specified request, using the given data.
void setAuthCfg(const QString &authCfg)
Sets the authentication config id which should be used during the request.
QString errorMessage() const
Returns the error message string, after a get(), post(), head() or put() request has been made.
@ NetworkError
A network error occurred.
@ NoError
No error was encountered.
@ TimeoutError
Timeout was reached before a reply was received.
void startUpload()
Called to start the upload.
void cancelUpload()
Call to abort the upload and delete this object after the cancellation has been processed.
void uploadError(QStringList errorMessages)
Emitted when an error makes the upload fail.
void uploadCompleted(const QUrl &url)
Emitted when the upload has completed successfully.
void uploadCanceled()
Emitted when the upload was canceled by the user.
QgsFileUploader(const QString &uploadFileName, const QUrl &url, const QString &formName=QString(), const QString &authcfg=QString(), bool delayStart=true)
QgsFileUploader.
~QgsFileUploader() override
void uploadProgress(qint64 bytesSent, qint64 bytesTotal)
Emitted when data are ready to be processed.
#define QgsSetRequestInitiatorClass(request, _class)