Topik ini menjelaskan cara menggunakan Object Storage Service (OSS) SDK untuk Ruby di aplikasi Rails untuk mencantumkan bucket, mengunggah objek, dan mengunduh objek.
Persiapan
Untuk menggunakan OSS SDK untuk Ruby dalam aplikasi Rails, tambahkan dependensi berikut ke file Gemfile.
gem 'aliyun-sdk', '~> 0.3.0
Tambahkan dependensi berikut ketika Anda menggunakan OSS SDK untuk Ruby:
require 'aliyun/oss'
Integrasi dengan Rails
Anda dapat melakukan langkah-langkah berikut untuk mengintegrasikan OSS SDK untuk Ruby dengan Rails:
Buat sebuah proyek.
Instal Rails dan buat aplikasi Rails bernama oss-manager.
gem install rails rails new oss-managerCatatanDalam contoh ini, aplikasi oss-manager adalah alat manajemen untuk objek OSS. Aplikasi ini dapat mencantumkan semua bucket, mencantumkan objek dalam bucket berdasarkan direktori, mengunggah objek, dan mengunduh objek.
Gunakan git untuk mengelola kode proyek.
cd oss-manager git init git add . git commit -m "init project"
Tambahkan dependensi SDK.
Edit
oss-manager/Gemfileuntuk menambahkan dependensi SDK.gem 'aliyun-sdk', '~> 0.3.0'Di direktori
oss-manager/, jalankanbundle install.Simpan perubahan.
git add . git commit -m "add aliyun-sdk dependency"
Inisialisasi instance OSSClient
Untuk menghindari inisialisasi setiap kali Anda menggunakan instance OSSClient dalam proyek, kami sarankan Anda membuat file inisialisasi di proyek.
# 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 Kode sebelumnya disimpan di direktori rails/ dari jalur instalasi OSS SDK untuk Ruby. Anda dapat menggunakan instance OSSClient dalam proyek setelah inisialisasi.
buckets = OSS.client.list_buckets Nilai endpoint, access_key_id, dan access_key_secret disimpan dalam file oss-manager/conf/secrets.yml.
development:
secret_key_base: xxxx
aliyun_oss:
endpoint: xxxx
access_key_id: aaaa
access_key_secret: bbbb Simpan perubahan.
git add .
git commit -m "add aliyun-sdk initializer" Cantumkan semua bucket
Anda dapat melakukan langkah-langkah berikut untuk mencantumkan semua bucket:
Gunakan Rails untuk menghasilkan pengontrol untuk mengelola bucket.
rails g controller buckets indexFile-file berikut dihasilkan dalam folder
oss-manager:app/controller/buckets_controller.rb: berisi kode logis terkait bucket.
app/views/buckets/index.html.erb: berisi kode yang digunakan untuk menampilkan konten terkait bucket.
app/helpers/buckets_helper.rb: mendefinisikan fungsi pembantu.
Edit `buckets_controller.rb`. Panggil client OSS dan simpan hasil operasi
list_bucketske variabel@buckets.class BucketsController < ApplicationController def index @buckets = OSS.client.list_buckets end endUbah file views/buckets/index.html.erb untuk mencantumkan bucket.
<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>Dalam `app/helpers/buckets_helper.rb`, definisikan fungsi pembantu
bucket_objects_path.module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" end endSetelah Anda menyelesaikan langkah-langkah sebelumnya, Anda dapat mencantumkan semua bucket.
Anda juga perlu mengonfigurasi routing Rails agar alamat yang dimasukkan di browser memanggil logika yang sesuai. Edit
config/routes.rbdan tambahkan konten berikut.resources :buckets do resources :objects endDi direktori
oss-manager/, jalankanrails suntuk memulai server Rails. Lalu, bukahttp://localhost:3000/buckets/di browser untuk melihat daftar bucket.Simpan perubahan.
git add . git commit -m "add list buckets feature"
Cantumkan semua objek dalam bucket berdasarkan direktori
Anda dapat melakukan langkah-langkah berikut untuk mencantumkan semua objek dalam bucket berdasarkan direktori:
Hasilkan pengontrol untuk mengelola objek.
rails g controller objects indexUbah file 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 endAnda dapat memperoleh nama bucket dari parameter di URL. Tambahkan awalan untuk mencantumkan objek berdasarkan direktori dan panggil operasi list_object dari instance OSSClient untuk mendapatkan daftar objek.
CatatanDalam contoh ini, objek yang namanya berisi awalan tertentu dan garis miring (/) sebagai pemisah diperoleh. Untuk informasi lebih lanjut, lihat Ikhtisar.
Ubah file 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 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>Objek dicantumkan berdasarkan direktori sesuai dengan logika berikut:
'../' selalu merujuk ke direktori induk.
Awalan umum dicantumkan sebagai direktori.
Objek ditampilkan sebagai file.
Kode di atas menggunakan fungsi pembantu seperti
with_prefixdanremove_prefix, yang didefinisikan dalam `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 endSetelah selesai, jalankan
rails s. Lalu, bukahttp://localhost:3000/buckets/my-bucket/objects/di browser untuk melihat daftar file.Simpan perubahan.
git add . git commit -m "add list objects feature"
Unduh objek
Dalam langkah-langkah di bagian sebelumnya, URL ditambahkan ke objek. Anda dapat menggunakan URL objek untuk mengunduh objek.
<td><%= link_to remove_prefix(object.key, @prefix),
@bucket.object_url(object.key) %></td> Anda juga dapat menggunakan bucket.object_url untuk menghasilkan URL sementara bagi file. Untuk informasi selengkapnya, lihat Download files.
Unggah objek
Untuk mengunggah objek di aplikasi Rails di server, Anda dapat menggunakan metode berikut:
Unggah objek dengan cara yang mirip dengan unggahan normal. Anda perlu mengunggah objek ke server Rails. Lalu, server Rails mengunggah objek ke OSS.
Unggah objek menggunakan form dan kredensial sementara yang dihasilkan oleh server.
Dalam `app/controllers/objects_controller.rb`, tambahkan metode
#newuntuk menghasilkan form unggah.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/' } endUbah file app/views/objects/new.html.erb.
<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" />  Catatanupload_formadalah fungsi pembantu yang disediakan oleh SDK untuk menghasilkan form unggah secara mudah. Fungsi ini tersedia di `rails/aliyun_oss_helper.rb`. Salin file tersebut ke direktori `app/helpers/`. Setelah itu, jalankanrails sdan bukahttp://localhost:3000/buckets/my-bucket/objects/newuntuk mengunggah file ke OSS.Simpan perubahan.
git add . git commit -m "add upload object feature"
Tambahkan gaya
Anda dapat melakukan langkah-langkah berikut untuk menambahkan gaya ke antarmuka aplikasi Rails:
Unduh Bootstrap. Setelah mengekstrak paketnya, salin file
bootstrap.min.csske direktoriapp/assets/stylesheets/.Ubah
app/views/layouts/application.html.erbdan ganti barisyielddengan kode berikut.<div id="main"> <%= yield %> </div>Untuk setiap halaman, tambahkan elemen
<div>dengan ID `main`. Lalu, ubahapp/assets/stylesheets/application.cssdan tambahkan konten berikut.body { text-align: center; } div#main { text-align: left; width: 1024px; margin: 0 auto; }
Untuk kode demo lengkap, kunjungi OSS Rails Demo.