与Rails集成
在Rails应用中使用OSS Ruby SDK只需要在Gemfile中添加以下依赖:
gem 'aliyun-sdk', '~> 0.3.0
然后在使用OSS时引入依赖就可以了:
require 'aliyun/oss'
另外,SDK的rails/目录下提供一些方便用户使用的辅助代码。
下面我们将利用SDK来实现一个简单的OSS文件管理器(oss-manager),最终包含以下功能:
gem install rails
rails new oss-manager
cd oss-manager
git init
git add .
git commit -m "init project"
gem 'aliyun-sdk', '~> 0.3.0'
bundle install
git add .
git commit -m "add aliyun-sdk dependency"
# 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
buckets = OSS.client.list_buckets
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"
rails g controller buckets index
class BucketsController < ApplicationController
def index
@buckets = OSS.client.list_buckets
end
end
<h1>Buckets</h1>
<table class="table table-striped">
<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>
module BucketsHelper
def bucket_objects_path(bucket_name)
"/buckets/#{bucket_name}/objects"
end
end
resources :buckets do
resources :objects
end
git add .
git commit -m "add list buckets feature"
rails g controller objects index
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
<h1>Objects in <%= @bucket_name %></h1>
<p> <%= link_to 'Upload file', new_object_path(@bucket_name, @prefix) %></p>
<table class="table table-striped">
<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>
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
git add .
git commit -m "add list objects feature"
<td><%= link_to remove_prefix(object.key, @prefix),
@bucket.object_url(object.key) %></td>
def new
@bucket_name = params[:bucket_id]
@prefix = params[:prefix]
@bucket = OSS.client.get_bucket(@bucket_name)
@options = {
:prefix => @prefix,
:redirect => 'http://localhost:3000/buckets/'
}
end
<h2>Upload object</h2>
<%= upload_form(@bucket, @options) do %>
<table class="table table-striped">
<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" style="display:inline" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" class="btn btn-default" value="Upload" />
<span> </span>
<%= link_to 'Back', objects_path(@bucket_name, @prefix) %>
</td>
</tr>
</table>
<% end %>
git add .
git commit -m "add upload object feature"
<div id="main">
<%= yield %>
</div>
body {
text-align: center;
}
div#main {
text-align: left;
width: 1024px;
margin: 0 auto;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。