自己创建的demo实现从网上下载图片然后保存到本地
用到QNetworkAccessManager 产生一个他的变量 m_network
QUrl
QNetworkRequest //网络请求
QNetworkReply //网络答复 产生一个他的变量 m_reply
信号 槽
readyRead() onReadyRead()
error(QNetworkReply::NetworkError) onError(QNetworkReply::NetworkError)
finished() onFinished()
.h
#ifndef
HTTP_NETWORK_H
#define
HTTP_NETWORK_H
#include
<QNetworkAccessManager>
#include
<QNetworkReply>
#include
<QNetworkRequest>
#include
<QUrl>
class
http_network
:
public
QObject
{
Q_OBJECT
public:
http_network
(
QObject
*
parent
=
0
);
~http_network();
void
download
(
const
QString
&
url
);
/*
调用的时候如果不加const,直接用download("http://articles.csdn.net/uploads/allimg/180301/285_180301103529_1_lit.jpg")是过不了的。
只能 QString str(""),download(&str);这样才行
但是加了const就可以直接用了。*/
public
slots
:
void
onReadyRead
();
void
onError
(
QNetworkReply
::
NetworkError
error
);
void
onFinished
();
void
onSslError
(
QList
<
QSslError
>);
private:
QNetworkAccessManager
*
m_network
;
QNetworkReply
*
m_reply
;
QByteArray
data
;
};
.cpp
首先构造函数里面实例化m_network
http_network
::
http_network
(
QObject
*
parent
)
:
QObject
(
parent
),
m_reply
(
0
)
{
m_network
=
new
QNetworkAccessManager
(
this
);
}
然后再析构函数里面进行判断
http_network
::~
http_network
()
{
if
(
m_reply
)
/
/返回的结果
{
//
m_reply->disconnect(this);
m_reply
->
deleteLater
();
m_reply
=
0
;
}
}
void
http_network
::
download
(
const
QString
&
url
)
{
QUrl
qurl
(
url
);
QNetworkRequest
request
(
qurl
);//
构造一个请求
if
(
m_reply
)
{
m_reply
->
disconnect
(
this
);
m_reply
->
deleteLater
();
m_reply
=
0
;
}
m_reply
=
m_network
->
get
(
request
);//
获得请求
connect
(
m_reply
,
SIGNAL
(
readyRead
()),
this
,
SLOT
(
onReadyRead
()));//
连接信号和槽
connect
(
m_reply
,
SIGNAL
(
error
(
QNetworkReply
::
NetworkError
)),
this
,
SLOT
(
onError
(
QNetworkReply
::
NetworkError
)));
connect
(
m_reply
,
SIGNAL
(
finished
()),
this
,
SLOT
(
onFinished
()));
connect
(
m_reply
,
SIGNAL
(
sslErrors
(
QList
<
QSslError
>)),
this
,
SLOT
(
onSslError
(
QList
<
QSslError
>)));
}
/*
如果链接里面的是https的头,则需要ssl进行认证在request之前加上这些代码就好了,不过再加入之前要把
libeay32.dll 、 ssleay32.dll动态链接库这两个动态库复制到debug里面,就可以了。连接http://download.csdn.net/download/goforwardtostep/9709448*/
QNetworkRequest
request;
//
QSslConfiguration
config;
QSslConfiguration
conf
=
request.sslConfiguration();
conf.setPeerVerifyMode(
QSslSocket::
VerifyNone);
conf.setProtocol(
QSsl::
TlsV1SslV3);
request.setSslConfiguration(conf);
request.setUrl(qurl);
*/
void
http_network
::
onReadyRead
()
{
data
.
append
(
m_reply
->
readAll
());
//图片过大是每次读一点,一定要记得拼接
/
/如果写成data = m_reply->readAll();这在之后保存图片的时候保存的是最后一次读的大小,并不是图片整体的大小
qDebug
()<<
"readyread"
<<
data
.
length
()<<
"byte
data"
<<
endl
;
}
void http_network::onError(QNetworkReply::NetworkError error)
{
m_reply->disconnect(this);
m_reply->deleteLater();
m_reply = 0;
qDebug()<<"http_error"<<error<<endl;
}
void http_network::onFinished()
{
QString string = data;
// QPixmap pixmap;
// pixmap.loadFromData(data);
QFile file(QDir::currentPath()+"/network/picname/1.jpg");//文件的名字
if(file.exists())
{
qDebug()<<"file has exinsts"<<endl;
qDebug()<<data.length()<<endl;
}else
{
QDir dir(QDir::currentPath()+"/network/picname");
dir.mkpath(QDir::currentPath()+"/network/picname");//创建多级目录
if(file.open(QFile::WriteOnly))
{
file.write(data);
file.close();
}
}
m_reply->disconnect(this);
m_reply->deleteLater();
m_reply = 0;
qDebug()<<"download finished"<<endl;
}
void http_network::onSslError(QList<QSslError>)
{
qDebug()<<"sslerror"<<endl;
}
main.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
http_network network;
network.download("http://articles.csdn.net/uploads/allimg/180301/285_180301103529_1_lit.jpg";);
return a.exec();
}
我代码的链接https://download.csdn.net/download/qq_36583051/10267101
动态库的链接:https://download.csdn.net/download/goforwardtostep/9709448