qml服务器上的图片不显示的问题

今天试着用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;
}
发布了275 篇原创文章 · 获赞 46 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/youyudexiaowangzi/article/details/101382429