GithubImageHost图床本地缓存设计

本文介绍了如何为一个简易的Github图床客户端实现本地图片缓存功能,支持图片预览和仓库同步,使用QDataStream处理自定义结构体以高效存储和读取图片信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GithubImageHost图床本地缓存设计

项目介绍:一个简易的Github图床客户端

项目仓库:GithubImageHost


试过很多图床,都缺少全部图片预览的功能(按照目录,预览仓库内所有图片),只有预览通过该图床上传过的图片。
想了下自己想要的:默认只预览本地上传和下载的图片,当点击更新仓库按钮后则同步仓库内所有图片到本地缓存并支持预览。
实现:把图片利用Qt的scaled调整到200, 150的尺寸,每次更新过后保存到本地文件。

利用QDataStream实现自定义结构体的写入写出:

struct GHImage
{
    QString html_url { "" };
    QString download_url { "" };
    QString name { "" };
    QString github_path { "" };
    QString sha { "" };
    QImage pix;

    friend QDataStream &operator<<(QDataStream &out, const GHImage &info)
    {
        return out << info.html_url << info.download_url << info.name << info.github_path << info.sha << info.pix;
    }

    friend QDataStream &operator>>(QDataStream &in, GHImage &info)
    {
        return in >> info.html_url >> info.download_url >> info.name >> info.github_path >> info.sha >> info.pix;
    }

    inline bool operator==(const GHImage &info)
    {
        return sha == info.sha && github_path == info.github_path;
    }
};

struct GithubInfo
{
    QString gh_token;
    QString user_name;
    QString repo_name;

    friend QDataStream &operator<<(QDataStream &out, const GithubInfo &info)
    {
        return out << info.gh_token << info.user_name << info.repo_name;
    }

    friend QDataStream &operator>>(QDataStream &in, GithubInfo &info)
    {
        return in >> info.gh_token >> info.user_name >> info.repo_name;
    }

    friend QDebug &operator<<(QDebug out, const GithubInfo &info)
    {
        out << info.gh_token << info.user_name << info.repo_name;
        return out;
    }

    inline bool operator==(const GithubInfo &info)
    {
        return gh_token == info.gh_token && user_name == info.user_name && repo_name == info.repo_name;
    }

    inline bool isEmpty() const
    {
        return gh_token.isEmpty() || user_name.isEmpty() || repo_name.isEmpty();
    }
};


using GHImageMap = QMap<QString, QList<GHImage>>;
static GHImageMap images_;
static QSize img_size_;
static GithubInfo info_;

GithubInfo GitHubImageHost::info_;
QSize GitHubImageHost::img_size_(200, 150);
GitHubImageHost::GHImageMap GitHubImageHost::images_;

void GitHubImageHost::WriteImages()
{

    QFile file(image_map_cfg_);
    if (file.open(QIODevice::WriteOnly)) {
        QDataStream out(&file);
        out << info_;
        out << int(images_.size());
        foreach (auto key, images_.keys()) {
            auto &list = images_.value(key);
            out << key << int(list.size());
            foreach (auto var, list) {
                out << var;
            }
        }
        file.close();
    }
}

void GitHubImageHost::ReadImages()
{
    images_.clear();
    QFile file(image_map_cfg_);
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);

        GithubInfo info;
        in >> info;
        if (info == info_) {
            int path_size;
            in >> path_size;
            while (path_size > 0) {
                path_size--;
                QString path;
                QList<GHImage> img_list;
                int img_size;
                in >> path >> img_size;
                while (img_size > 0) {
                    img_size--;
                    QString path;
                    GHImage img;
                    in >> img;
                    img_list << img;
                }
                images_[path] = img_list;
            }

        } else {
            qDebug() << u8"githubinfo.cfg 校验失败";
        }

        file.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beyond欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值