繁体   English   中英

需要帮助存储 blob 并将其显示在浏览器中

[英]Need help storing blob and displaying it in browser

我正在尝试在 React 组件中显示我用于 API(ALPHA_3 数组)的每个国家/地区代码的图像。 getFlags() 和 appendImg() 在组件中导入并执行,但看起来 imgs 已损坏/不存在。

我找到了一个 API (countryflags.io),它为我使用的每个国家/地区提供 png - 但它使用 alpha2 命名。 为了获取使用 ALPHA2 的 countryflags API,我对我的 ALPHA_3 数组进行了切片,并对数组中的每个国家/地区代码进行了获取请求。 使用 alpha2 代码作为键和 blob 作为值将所有内容保存到 localestorage。

当我尝试显示 blob 时,它们显示为损坏的图像,我无法弄清楚是什么原因造成的。 另外,有没有更好的方法来存储 blob 或者 localestorage 就好了?

                const ALPHA_3 = [
                'CAD',
                'HKD',
                'ISK',
                'PHP',
                'DKK',
                'HUF',
                'CZK',
                'AUD',
                'RON',
                'SEK',
                'IDR',
                'INR',
                'BRL',
                'RUB',
                'HRK',
                'JPY',
                'THB',
                'CHF',
                'SGD',
                'PLN',
                'BGN',
                'TRY',
                'CNY',
                'NOK',
                'NZD',
                'ZAR',
                'USD',
                'MXN',
                'ILS',
                'GBP',
                'KRW',
                'MYR',
            ];

            const base_url = 'https://www.countryflags.io';
            const opts = { mode: 'no-cors', 'Content-Type': 'image/png' };
            const ALPHA_2 = [];

            const getFlags = () => {
                ALPHA_3.forEach((element) => ALPHA_2.push(element.slice(0, -1)));
                ALPHA_2.forEach((element) => {
                    fetch(base_url + `/${element}/flat/32.png`, opts)
                        .then((response) => response.blob())
                        .then((png) =>
                            localStorage.setItem(`${element}`, URL.createObjectURL(png))
                            
                        );
                });
            };
            export default getFlags;


            export const appendImg = () => {
                Object.values(localStorage).forEach((v) => {
                    let image = document.createElement(`img`);
                    image.src = v;
                    document.body.appendChild(image);
                });
            };

感谢您提醒有关 localestorage 中的有限存储以及 URL.createObjectURL() 在刷新时中断的问题。 我重构了代码以使用缓存 API,并设法将每个速率的 alpah2 代码与响应一起保存为缓存中的键值对,使用 PUT 方法,因为没有cors。 现在我想知道如何从另一个文件/反应组件访问缓存并将其显示在浏览器中。

            const ALPHA_3 = [
            'CAD',
            'HKD',
            'ISK',
            'PHP',
            'DKK',
            'HUF',
            'CZK',
            'AUD',
            'RON',
            'SEK',
            'IDR',
            'INR',
            'BRL',
            'RUB',
            'HRK',
            'JPY',
            'THB',
            'CHF',
            'SGD',
            'PLN',
            'BGN',
            'TRY',
            'CNY',
            'NOK',
            'NZD',
            'ZAR',
            'USD',
            'MXN',
            'ILS',
            'GBP',
            'KRW',
            'MYR',
        ];

        const cacheFlags = async () => {
            const imageCache = await caches.open('imageCache');
            if (imageCache.keys().length >= 32) return false; 
            const base_url = 'https://www.countryflags.io';
            const opts = { mode: 'no-cors', 'Content-Type': 'image/png' };
            const ALPHA_2 = [];
            ALPHA_3.forEach((element) => ALPHA_2.push(element.slice(0, -1)));
            ALPHA_2.forEach((element) => {
                let url = base_url + `/${element}/flat/32.png`;
                fetch(url, opts)
                    .then((response) => {
                        imageCache.put(element, response);
                    })
                    .catch((error) => error);
            });
        };
        export default cacheFlags;

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM