实现从网上下载图片然后保存到本地

自己创建的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;


return a.exec();
}



我代码的链接https://download.csdn.net/download/qq_36583051/10267101

动态库的链接:https://download.csdn.net/download/goforwardtostep/9709448

猜你喜欢

转载自blog.csdn.net/qq_36583051/article/details/79426293