我知道传统的方法是将图像/视频文件存储在一个地方,然后将参考索引保存到 db 的表中。
现在我在学习gundb,我可以很容易地存储key-value json类型的数据,但是由于它是分散的,如果我想做一个说聊天室的应用程序,我应该如何处理图像存储(例如:用户的头像)?
我也想知道是否可以使用 gundb 制作电影共享应用程序?
@Retric,好问题!我不确定为什么人们对你投反对票,他们一定是仇恨者。
你是对的,最好存储该图像/视频并通过 GUN 引用它。特别是对于视频,WebTorrent/BitTorrent 已经做了十多年的 P2P 视频共享,曾经处理过全球 40% 的互联网流量!
然而,WebTorrent/BitTorrent 在发现/共享这些 URI(磁力链接等)方面不是很好,但 GUN 是。因此,我建议将其作为一种选择。
对于图像,尤其是像头像/图标/配置文件这样的小图像,我经常通过Base64
编码将它们直接存储在 GUN 中(世界上许多网站将图像/图标/精灵/头像内联到具有 base64 数据 URL 的 CSS 文件中,除了现在你可以为此使用 GUN)。
如果您对此感兴趣,我使用 jQuery 编写了一个小实用程序,可让您将图像拖放到您的网站中,它会自动调整大小(传递选项以覆盖它)并为您进行 base64 编码,然后保存到 GUN:
https://github.com/amark/gun/blob/master/lib/upload.js
这是我如何使用它的一个小例子:
$('#profile').upload(function resize(e, up){
if(e.err){ return } // handle error
$('#profile').addClass('pulse'); // css to indicate image processing
if(up){ return up.shrink(e, resize, 64) } // pass it `e` drag&drop/upload event, then I reuse the current function (named resize) as the callback for it, and tell it resize to 64px.
$('#profile').removeClass('pulse'); // css indicate done processing.
$("#profile img").attr('src', e.base64).removeClass('none'); // set photo in HTML!
gun.user().get('who').get('face').get('small').put(e.base64); // save profile thumbnail to GUN
});
最后,如果您不想使用 BitTorrent,如何将视频存储在 GUN 中?
我强烈建议使用 HLS 格式将视频存储在 GUN 中,这将允许您进行分散的实时视频流。这是一种非常简单的格式,甚至可以从静态文件中进行视频流式传输,因为它将视频存储在可以流式传输的小块中 - 非常适合 GUN。
已经有一个基于 JS 的 HLS 格式的视频播放器:
https://github.com/video-dev/hls.js/
根据演示页面,您可以看到视频存储方式的示例,例如在 GitHub 上:
https://github.com/video-dev/streams/tree/master/x36xhzz
(如果你点击 m3u8 文件,你会看到它有元数据,720p 存储在url_0
文件夹中,文件夹本身有子文件)
gun.get('videos').get('x36xhzz').get('url_0').get('url_496').get('193039199_mp4_h264_aac_hd_7.ts').once(function(video_chunk){ passToHLSplayer(video_chunk) })
您可以使用相同的文件夹结构将 HLS 视频文件存储在 GUN 中,以便 HLS.js 轻松与 GUN 集成,而不是将 HLS 视频文件存储在 BitTorrent 或集中式服务器上。
现在您将拥有 P2P 分散式视频流!!!
更酷的是,您可以将它与 GUN 的lib/webrtc
适配器结合使用,完全浏览器到浏览器!
我希望这会有所帮助。