开发者社区> 问答> 正文

对象存储 OSS5. 实现List objects功能

已解决

展开
收起
2018-05-05 09:39:54 1668 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

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

    1. rails g controller objects index

    然后编辑app/controllers/objects_controller.rb:

    1. class ObjectsController < ApplicationController
    2. def index
    3. @bucket_name = params[:bucket_id]
    4. @prefix = params[:prefix]
    5. @bucket = OSS.client.get_bucket(@bucket_name)
    6. @objects = @bucket.list_objects(:prefix => @prefix, :delimiter => '/')
    7. end
    8. end

    上面的代码首先从URL的参数中获取Bucket名字,为了只按目录层级显示,我们还需要一个前缀。然后调用OSS Client的list_objects接口获取文件列表。注意,这里获取的是指定前缀下,并且以’/‘为分界的文件。这样做是为也按目录层级列出文件。请参考管理文件

    接下来编辑app/views/objects/index.html.erb:

    1. <h1>Objects in <%= @bucket_name %></h1>
    2. <p> <%= link_to 'Upload file', new_object_path(@bucket_name, @prefix) %></p>
    3. <table class="table table-striped">
    4. <tr>
    5. <th>Key</th>
    6. <th>Type</th>
    7. <th>Size</th>
    8. <th>LastModified</th>
    9. </tr>
    10. <tr>
    11. <td><%= link_to '../', with_prefix(upper_dir(@prefix)) %></td>
    12. <td>Directory</td>
    13. <td>N/A</td>
    14. <td>N/A</td>
    15. </tr>
    16. <% @objects.each do |object| %>
    17. <tr>
    18. <% if object.is_a?(Aliyun::OSS::Object) %>
    19. <td><%= link_to remove_prefix(object.key, @prefix),
    20. @bucket.object_url(object.key) %></td>
    21. <td><%= object.type %></td>
    22. <td><%= number_to_human_size(object.size) %></td>
    23. <td><%= object.last_modified.localtime.to_s %></td>
    24. <% else %>
    25. <td><%= link_to remove_prefix(object, @prefix), with_prefix(object) %></td>
    26. <td>Directory</td>
    27. <td>N/A</td>
    28. <td>N/A</td>
    29. <% end %>
    30. </tr>
    31. <% end %>
    32. </table>

    上面的代码将文件按目录结构显示,主要逻辑是:

    1. 总是在第一个显示’../‘指向上级目录
    2. 对于Common prefix,显示为目录
    3. 对于Object,显示为文件

    上面的代码中用到了with_prefix, remove_prefix等一些辅助函数,它们定义在app/helpers/objects_helper.rb中:

    1. module ObjectsHelper
    2. def with_prefix(prefix)
    3. "?prefix=#{prefix}"
    4. end
    5. def remove_prefix(key, prefix)
    6. key.sub(/^#{prefix}/, '')
    7. end
    8. def upper_dir(dir)
    9. dir.sub(/[^\/]+\/$/, '') if dir
    10. end
    11. def new_object_path(bucket_name, prefix = nil)
    12. "/buckets/#{bucket_name}/objects/new/#{with_prefix(prefix)}"
    13. end
    14. def objects_path(bucket_name, prefix = nil)
    15. "/buckets/#{bucket_name}/objects/#{with_prefix(prefix)}"
    16. end
    17. end

    完成之后运行rails s,然后在浏览器中输入地址http://localhost:3000/buckets/my-bucket/objects/就可以查看文件列表了。

    惯例保存代码:

    2018-05-11 20:45:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载