今天试着用qml的Image加载网络上的 图片,发现什么都不显示,但是用浏览器查看又可以访问,而且可以下载,下载之后用file:///E:/ab8fc3f078f027197484aa4cb30b9505可以访问
测试思路:
1.以为是后缀的问题,结果去服务器上修改文件名称,加上.jpg后缀依然没用
2.以为出bug了,用http://拼上路径又可以访问
3.想着本地文件能加载,那么就用QT把文件下载下来,然后再显示,结果下载报错99
解决过程:
1.下载报错,但是http://拼接的文件可以下载,发现是https的原因,下载的时候强制把https改成http,下载到本地后可以访问
2.既然发现https导致下载不成功,那么qml显示不了肯定也是https导致的,于是百度发现缺少libeay32.dll和ssleay32.dll,就从qt自带的库目录D:\Qt\Qt5.11.2\Tools\mingw530_32\opt\bin中复制了这两个文件到运行目录D:\Qt\Qt5.11.2\5.11.2\mingw53_32\bin于是不用下载也可以直接显示了
小插曲:
网上找的下载用的代码
FileDownloader.h
#ifndef FILEDOWNLOADER_H
#define FILEDOWNLOADER_H
#include <QObject>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
class FileDownloader : public QObject
{
Q_OBJECT
public:
QUrl m_Url;
explicit FileDownloader(QUrl imageUrl, QObject *parent = 0);
virtual ~FileDownloader();
QByteArray downloadedData() const;
signals:
void downloaded(FileDownloader*);
private slots:
void fileDownloaded(QNetworkReply* pReply);
private:
QNetworkAccessManager m_WebCtrl;
QByteArray m_DownloadedData;
};
#endif // FILEDOWNLOADER_H
FileDownloader.cpp
#include "filedownloader.h"
FileDownloader::FileDownloader(QUrl imageUrl, QObject *parent) :
QObject(parent)
, m_Url(imageUrl)
{
connect(
&m_WebCtrl, SIGNAL (finished(QNetworkReply*)),
this, SLOT (fileDownloaded(QNetworkReply*))
);
QNetworkRequest request(imageUrl);
m_WebCtrl.get(request);
}
FileDownloader::~FileDownloader() { }
void FileDownloader::fileDownloaded(QNetworkReply* pReply)
{
int statusCode = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
m_DownloadedData = pReply->readAll();
qDebug(qPrintable(pReply->request().url().toString()));
qDebug("read All length %d statuscode %d error %d", m_DownloadedData.length(), statusCode, pReply->error());
//emit a signal
pReply->deleteLater();
emit downloaded(this);
}
QByteArray FileDownloader::downloadedData() const {
return m_DownloadedData;
}
调用
void mainWindow::getLocalPathFromUrl(QString url)
{
//url.replace("https://", "http://");//如果没有https的支持,只能替换后将就用一下
QUrl imageUrl(url);
FileDownloader *pImgCtrl = new FileDownloader(imageUrl, this);
connect(pImgCtrl, SIGNAL (downloaded(FileDownloader*)), this, SLOT (handleDownloadedData(FileDownloader*)));
}
void mainWindow::handleDownloadedData(FileDownloader* pImgCtrl)
{
QStringList sl = pImgCtrl->m_Url.toString().split("?")[0].split('/');
int index = 0;
if(sl.last().length()<2){
index = sl.length() - 2;
}else{
index = sl.length() - 1;
}
qDebug("index : %d", index);
qDebug(qPrintable(sl[index]));
if(index){
QString path = QDir::currentPath();
path.replace('\\', '/');//好想不用替换
path += "/" + sl[index];
QFile file(path);
file.open(QFile::ReadWrite);
//datastream 会多出4个字节表示文件大小
//QDataStream out(&file);
//out << pImgCtrl->downloadedData();
//用data写又只有4个字节
//file.write(pImgCtrl->downloadedData().data());
//所以直接用QByteArray写
file.write(pImgCtrl->downloadedData());
file.close();
qDebug("download size : %d", pImgCtrl->downloadedData().length());
emit imageOk("file:///" + path);
}
delete pImgCtrl;
}
文件太大的话,需要分段下载,分段下载主要是请求分段数据
QNetworkRequest req;
req.setUrl(url);
QString rangePart;
rangePart.sprintf(";Bytes=%lld-%lld";, m_StartPoint, m_EndPoint);
req.setRawHeader(";Range";, rangePart.toAscii());
获取文件大小
qint64 FileDownloader::getFileSize(QUrl url)
{
QNetworkAccessManager manager;
qDebug() << "Getting the file size..." << url.toString();
QEventLoop loop;
//发出请求,获取目标地址的头部信息
QNetworkReply *reply = manager.head(QNetworkRequest(url));
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QVariant var = reply->header(QNetworkRequest::ContentLengthHeader);
qint64 size = var.toLongLong();
qDebug() << url.toString() << " file size is: " << size;
delete reply;
return size;
}