我知道传统的方法是将图像/视频文件存储在一个地方,然后将引用索引保存到db的表中。
现在我正在学习gundb,我可以很容易地存储键值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
});
Run Code Online (Sandbox Code Playgroud)
最后,如果您不想使用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文件夹中的元数据,该文件本身也包含子文件)
与其将HLS视频文件存储在BitTorrent或中央服务器上,还不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) })如将其存储在GUN中,使用的是相同的文件夹结构,这样HLS.js可以很容易地与GUN集成。
现在您将拥有P2P去中心化视频流!!!
甚至更酷,您也可以将其与GUN的lib/webrtc适配器结合使用,并在不同的浏览器之间完成此操作!
希望对您有所帮助。