使用riak-erlang-client从riak通过氮气存储和检索照片文件

时间:2015-01-22 15:36:03

标签: post erlang riak nitrogen riak-cs

我正在运行一个由5个节点组成的riak集群,我通过协议缓冲客户端riak-erlang-client连接到这些集群。我按照this stackoverflow link的建议,将 riak-erlang-client 安装为氮插件。我知道如何通过氮气网络框架上传文件,之后我尝试将它们存储在riak数据库中,然后我将其检索。

我看过Basho resources

上显示的这个重点
curl -XPUT http://localhost:10018/buckets/images/keys/<image_name>.jpg -H 'Content-Type: image/jpeg' --data-binary @<image_name>.jpg

但它根本无法满足我的需求,因为它甚至没有使用我正在使用的客户端!!

我曾经使用过Erlang / OTP的文件库从氮的 ./ scratch 目录中读取照片文件,以便将照片文件保存为二进制流在riak数据库中,但我无法将它们检索到我的氮驱动的Web应用程序。

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

首先使用钢筋将riak-erlang-client添加到氮作为插件。将下面的依赖项添加到项目中的rebar.config中。 Basho resource

{deps, [
    {riakc, "1.4.1",
      {git, "git://github.com/basho/riak-erlang-client", 
         {tag, "1.4.1"}}}
   ]}.

然后在您的应用程序中运行make

cd ../../myapp
make

使用例如Nitrogen upload example上传文件。找到源代码here

在finish_upload_event部分中捕获scratch文件夹中的LocalFileName文件路径。使用文件路径读取文件。

event(_) -> ok.

start_upload_event(Tag) ->
    wf:flash(wf:f("Upload started with tag (~p)", [Tag])).

finish_upload_event(_Tag, undefined, _, _) -> 
   wf:flash("Please select a file."), ok;

finish_upload_event(_Tag, _FileName, LocalFileName, _Node) ->
   {ok, Binary_image} = file:read_file(LocalFileName),

   %% Open a connection to the Riak database
   {ok, Pid} = riakc_pb_socket:start(DBNode,PORT,{connect_timeout,TIMEOUT},auto_reconnect, false}])).

   %% If the bucket where you save your images is called my_images, create the riak object
   Obj = riakc_obj:new(term_to_binary(my_images),term_to_binary(My_key),Binary_image),

   %% Save to the database
   ok = riakc_pb_socket:put(Pid, Obj,[]).

从数据库中读取图像并在Web浏览器中显示

-module(image).
-include_lib("nitrogen_core/include/wf.hrl").
-compile(export_all).   

main() -> 
   %% Set the content-type of the image
   wf:content_type("image/png"),
   {ok, Pid} = riakc_pb_socket:start(DBNode,PORT,{connect_timeout,TIMEOUT},auto_reconnect, false}])).

   %% Read the image data from the database
   {ok, Fetched} = riakc_pb_socket:get(Pid,     term_to_binary(my_images),term_to_binary(My_key),[]),

   %% Record the image record
   Binary_image = binary_to_term(riakc_obj:get_value(Fetched)),
   Binary_image.        

event(_) -> ok. 

在浏览器结构中,您的图片文件的网址如http://example.com/image

图像是渲染图像文件的模块。