閱讀1006 返回首頁    go windows


Rails應用__Ruby-SDK_SDK 參考_對象存儲 OSS-阿裏雲

在Rails應用中使用OSS Ruby SDK隻需要在Gemfile中添加以下依賴:

gem 'aliyun-sdk', '~> 0.3.0

然後在使用OSS時引入依賴就可以了:

require 'aliyun/oss'

另外,SDK的rails/目錄下提供一些方便用戶使用的輔助代碼。

下麵我們將利用SDK來實現一個簡單的OSS文件管理器(oss-manager),最終包 含以下功能:

  • 列出用戶所有的Bucket
  • 列出Bucket下所有的文件,按目錄層級列出
  • 上傳文件
  • 下載文件

1. 創建項目

先安裝Rails,然後創建一個Rails應用,oss-manager:

gem install rails
rails new oss-manager

作為一個好的習慣,使用git管理項目代碼:

cd oss-manager
git init
git add .
git commit -m "init project"

2. 添加SDK依賴

編輯oss-manager/Gemfile,向其中加入SDK的依賴:

gem 'aliyun-sdk', '~> 0.3.0'

然後在oss-manager/下執行:

bundle install

保存這一步所做的更改:

git add .
git commit -m "add aliyun-sdk dependency"

3. 初始化OSS Client

為了避免在項目中用到OSS Client的地方都要初始化,我們在項目中添加一個初 始化文件,方便在項目中使用OSS Client:

# oss-manager/config/initializers/aliyun_oss_init.rb
require 'aliyun/oss'

module OSS
  def self.client
    unless @client
      Aliyun::Common::Logging.set_log_file('./log/oss_sdk.log')

      @client = Aliyun::OSS::Client.new(
        endpoint:
          Rails.application.secrets.aliyun_oss['endpoint'],
        access_key_id:
          Rails.application.secrets.aliyun_oss['access_key_id'],
        access_key_secret:
          Rails.application.secrets.aliyun_oss['access_key_secret']
      )
    end

    @client
  end
end

上麵的代碼在SDK的rails/目錄下可以找到。這樣初始化後,在項目中使用OSS Client就非常方便:

buckets = OSS.client.list_buckets

其中endpoint和AccessKeyId/AccessKeySecret保存在 oss-manager/conf/secrets.yml中,例如:

development:
  secret_key_base: xxxx
  aliyun_oss:
    endpoint: xxxx
    access_key_id: aaaa
    access_key_secret: bbbb

保存代碼:

git add .
git commit -m "add aliyun-sdk initializer"

4. 實現List buckets功能

首先用rails生成管理Buckets的controller:

rails g controller buckets index

這樣會在oss-manager中生成以下文件:

  • app/controller/buckets_controller.rb Buckets相關的邏輯代碼
  • app/views/buckets/index.html.erb Buckets相關的展示代碼
  • app/helpers/buckets_helper.rb 一些輔助函數

首先編輯buckets_controller.rb,調用OSS Client,將list_buckets的結果 存放在@buckets變量中:

class BucketsController < ApplicationController
  def index
    @buckets = OSS.client.list_buckets
  end
end

然後編輯views/buckets/index.html.erb,將Bucket列表展示出來:

<h1>Buckets</h1>
<table >
  <tr>
    <th>Name</th>
    <th>Location</th>
    <th>CreationTime</th>
  </tr>

  <% @buckets.each do |bucket| %>
  <tr>
    <td><%= link_to bucket.name, bucket_objects_path(bucket.name) %></td>
    <td><%= bucket.location %></td>
    <td><%= bucket.creation_time.localtime.to_s %></td>
  </tr>
  <% end %>
</table>

其中bucket_objects_path是一個輔助函數,在 app/helpers/buckets_helper.rb中:

module BucketsHelper
  def bucket_objects_path(bucket_name)
    "/buckets/#{bucket_name}/objects"
  end
end

這樣就完成了列出所有Bucket的功能。在運行之前,我們還需要配置Rails 的路由,使得我們在瀏覽器中輸入的地址能夠調用正確的邏輯。編輯 config/routes.rb,增加一條:

resources :buckets do
  resources :objects
end

好了,在oss-manager/下輸入rails s以啟動rails server,然後在瀏覽器中 輸入https://localhost:3000/buckets/就能看到Bucket列表了。

最後保存一下代碼:

git add .
git commit -m "add list buckets feature"

5. 實現List objects功能

首先生成一個管理Objects的controller:

rails g controller objects index

然後編輯app/controllers/objects_controller.rb:

class ObjectsController < ApplicationController
  def index
    @bucket_name = params[:bucket_id]
    @prefix = params[:prefix]
    @bucket = OSS.client.get_bucket(@bucket_name)
    @objects = @bucket.list_objects(:prefix => @prefix, :delimiter => '/')
  end
end

上麵的代碼首先從URL的參數中獲取Bucket名字,為了隻按目錄層級顯示,我們 還需要一個前綴。然後調用OSS Client的list_objects接口獲取文件列表。注意, 這裏獲取的是指定前綴下,並且以'/'為分界的文件。這樣做是為也按目錄層級 列出文件。請參考管理文件

接下來編輯app/views/objects/index.html.erb:

<h1>Objects in <%= @bucket_name %></h1>
<p> <%= link_to 'Upload file', new_object_path(@bucket_name, @prefix) %></p>
<table >
  <tr>
    <th>Key</th>
    <th>Type</th>
    <th>Size</th>
    <th>LastModified</th>
  </tr>

  <tr>
    <td><%= link_to '../', with_prefix(upper_dir(@prefix)) %></td>
    <td>Directory</td>
    <td>N/A</td>
    <td>N/A</td>
  </tr>

  <% @objects.each do |object| %>
  <tr>
    <% if object.is_a?(Aliyun::OSS::Object) %>
    <td><%= link_to remove_prefix(object.key, @prefix),
            @bucket.object_url(object.key) %></td>
    <td><%= object.type %></td>
    <td><%= number_to_human_size(object.size) %></td>
    <td><%= object.last_modified.localtime.to_s %></td>
    <% else  %>
    <td><%= link_to remove_prefix(object, @prefix), with_prefix(object) %></td>
    <td>Directory</td>
    <td>N/A</td>
    <td>N/A</td>
    <% end  %>
  </tr>
  <% end %>
</table>

上麵的代碼將文件按目錄結構顯示,主要邏輯是:

  1. 總是在第一個顯示'../'指向上級目錄
  2. 對於Common prefix,顯示為目錄
  3. 對於Object,顯示為文件

上麵的代碼中用到了with_prefix, remove_prefix等一些輔助函數,它們定 義在app/helpers/objects_helper.rb中:

module ObjectsHelper
  def with_prefix(prefix)
    "?prefix=#{prefix}"
  end

  def remove_prefix(key, prefix)
    key.sub(/^#{prefix}/, '')
  end

  def upper_dir(dir)
    dir.sub(/[^/]+/$/, '') if dir
  end

  def new_object_path(bucket_name, prefix = nil)
    "/buckets/#{bucket_name}/objects/new/#{with_prefix(prefix)}"
  end

  def objects_path(bucket_name, prefix = nil)
    "/buckets/#{bucket_name}/objects/#{with_prefix(prefix)}"
  end
end

完成之後運行rails s,然後在瀏覽器中輸入地址 https://localhost:3000/buckets/my-bucket/objects/就可以查看文件列表了。

慣例保存代碼:

git add .
git commit -m "add list objects feature"

6. 下載文件

注意到在上一步顯示文件列表時,我們為每個文件也添加了一個鏈接:

<td><%= link_to remove_prefix(object.key, @prefix),
        @bucket.object_url(object.key) %></td>

其中Bucket#object_url是一個為文件生成臨時URL的方法,參考 下載文件

7. 上傳文件

在Rails這種服務端應用中,用戶上傳文件有兩種辦法:

  1. 用戶先將文件上傳到Rails的服務器上,服務器再將文件上傳到OSS。這樣做 需要Rails服務器作為中轉,文件多拷貝了一遍,不是很高效。
  2. 服務器為用戶生成表單和臨時憑證,用戶直接上傳文件到OSS。

第一種方法比較簡單,與普通的上傳文件一樣。下麵我們用的是第二種方法:

首先在app/controllers/objects_controller.rb中增加一個#new方法,用於 生成上傳表單:

def new
  @bucket_name = params[:bucket_id]
  @prefix = params[:prefix]
  @bucket = OSS.client.get_bucket(@bucket_name)
  @options = {
    :prefix => @prefix,
    :redirect => 'https://localhost:3000/buckets/'
  }
end

然後編輯app/views/objects/new.html.erb:

<h2>Upload object</h2>

<%= upload_form(@bucket, @options) do %>
  <table >
    <tr>
      <td><label>Bucket:</label></td>
      <td><%= @bucket.name  %></td>
    </tr>
    <tr>
      <td><label>Prefix:</label></td>
      <td><%= @prefix  %></td>
    </tr>

    <tr>
      <td><label>Select file:</label></td>
      <td><input type="file" name="file"  /></td>
    </tr>

    <tr>
      <td colspan="2">
        <input type="submit"  value="Upload" />
        <span>&nbsp;&nbsp</span>
        <%= link_to 'Back', objects_path(@bucket_name, @prefix) %>
      </td>
    </tr>
  </table>
<% end %>

其中upload_form是SDK提供的一個方便用戶生成上傳表單的輔助函數,在SDK 的代碼rails/aliyun_oss_helper.rb中。用戶需要將其拷貝到app/helpers/目 錄下。完成之後運行rails s,然後訪問 https://localhost:3000/buckets/my-bucket/objects/new就能夠上傳文件了。

最後記得保存代碼:

git add .
git commit -m "add upload object feature"

8. 添加樣式

為了讓界麵更好看一些,我們可以添加一點樣式(CSS)。

首先下載bootstrap,解壓後將 bootstrap.min.css拷貝到app/assets/stylesheets/下。

然後在修改app/views/layouts/application.html.erb,將yield一行改成:

  <div >
    <%= yield %>
  </div>

這會為每個頁麵添加一個id為main的<div>,然後修改 app/assets/stylesheets/application.css,加入以下內容:

body {
    text-align: center;
}

div#main {
    text-align: left;
    width: 1024px;
    margin: 0 auto;
}

這會讓網頁的主體內容居中顯示。通過添加簡單的樣式,我們的頁麵是不是更加 賞心悅目了呢?

至此,一個簡單的demo就完成了。完整的demo代碼可以在 OSS Ruby SDK Demo中找到。

最後更新:2016-11-23 17:16:08

  上一篇:go FAQ__C-SDK_SDK 參考_對象存儲 OSS-阿裏雲
  下一篇:go 設置訪問權限__Ruby-SDK_SDK 參考_對象存儲 OSS-阿裏雲