• 关于 html_table函数 的搜索结果

问题

Python:在Postgres中插入大型dataframe (1.2M行)的问题

kun坤 2019-12-30 09:34:45 0 浏览量 回答数 0

回答

好的,首先要注意的是DataFrame.to_html函数会生成完整表,因此无需放置外部` 模板中的`标签。 我将通过创建一个函数来实现此目的,该函数返回要在模板中使用的字典: from flask import Flask, render_template app = Flask(__name__) # Just define this once classes = 'w3-table w3-striped w3-border' def gen_dict(df, title): return {'title': title, 'table': df.head().to_html(classes=classes) } 然后在您的路由中,以例如df和dfrme作为两个数据帧,创建一个嵌套字典,然后将其与dict拆包一起传递给render_template函数: @app.route('/') def index(): d = {'df1': gen_dict(df, 'First Dataframe'), 'df2': gen_dict(dfrme, 'Second Dataframe') } return render_template('index.html', \*d) 然后,您可以在模板中分别显示每个表以及标题: <h1> {{df1.title}} </h1> {{df1.table|safe}} Some where else... <h1> {{df2.title}} </h1> {{df2.table|safe}} 将来添加更多的数据帧,然后成为向d字典添加相似的键/值对并编辑模板代码的情况。 回答来源:stackoverflow

is大龙 2020-03-24 10:07:56 0 浏览量 回答数 0

问题

需要左值作为赋值的左操作数-函数指针

祖安文状元 2020-01-08 15:01:03 0 浏览量 回答数 1

海外云虚拟主机包年25元/月起

海外独享虚拟主机全面上线,助力构建海外网站,提升公司国际形象;全球有效覆盖,超高性价比;建站入门首选,助力出口,适合跨境贸易企业。

回答

详细解答可以参考官方帮助文档首先用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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://localhost:3000/buckets/就能看到Bucket列表了。 最后保存一下代码:

2019-12-01 23:14:37 0 浏览量 回答数 0

回答

将execl表格导出为csv格式,然后数据就是一行一行以逗号分割的数据。后面就好办了吧######找python的excel库。 ###### http://www.lexicon.net/sjmachin/xlrd.html 多看看文档有益身心健康 file_contents... as a string or an mmap.mmap object or some other behave-alike object. If file_contents is supplied, filename will not be used, except (possibly) in messages. ###### import pandas as pd data=pd.read_excel(file_excel) ###### 引用来自“魔力猫”的评论找python的excel库。 已经试过很多了,都是读取确定的文件路径的excel文件,和我现在的情况不一样,我是需要读取二进制excel文件######回复 @魔力猫 : 同意。找找肯定能找到读对file对象的接口,把filedata写到一个StringIO里传给它就行了######你仔细看看API,肯定有写怎么处理流的API。######不上班吧###### import xlrd data = xlrd.open_work(filedata) table = data.sheets()[0] col_1 = table.col_values(0) col_2 = table.col_values(1) ... ###### 引用来自“noob_zxf”的评论 import xlrd data = xlrd.open_work(filedata) table = data.sheets()[0] col_1 = table.col_values(0) col_2 = table.col_values(1) ... xlrd.open_workbook()是不行的,该函数直接将filedata作为文件全名来处理的; ###### "excel上传被转换成了一个二进制文件"  得搞清楚上传的这块怎么做的。才能逆向推回来.######\t

kun坤 2020-06-06 17:03:44 0 浏览量 回答数 0

回答

检出此页面:https : //web.archive.org/web/20150329004325/https : //dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 在页面底部他们说明了如何通过将表达式传递给该MySQL函数来使LAST_INSERT_ID对更新有意义。 从MySQL文档示例中: 如果表包含AUTO_INCREMENT列,并且INSERT ... UPDATE插入一行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。如果该语句改为更新一行,则LAST_INSERT_ID()没有意义。但是,您可以通过使用LAST_INSERT_ID(expr)解决此问题。假设id是AUTO_INCREMENT列。为了使LAST_INSERT_ID()对于更新有意义,请按如下所示插入行: INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;来源:stack overflow

保持可爱mmm 2020-05-11 17:03:20 0 浏览量 回答数 0

问题

DRDS 错误代码如何解决?

猫饭先生 2019-12-01 21:21:21 7993 浏览量 回答数 0

问题

PHP MySQL Select

ethnicity 2019-12-01 22:08:29 7633 浏览量 回答数 0

问题

oss c sdk利用CURL提供的Callback实现上传

yjseu 2019-12-01 21:49:22 10252 浏览量 回答数 2

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:34 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:34 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:34 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:35 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:35 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:36 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:35 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档与Rails集成在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 railsrails new oss-manager作为一个好的习惯,使用git管理项目代码: cd oss-managergit initgit 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.rbrequire '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 endend 上面的代码在SDK的rails/目录下可以找到。这样初始化后,在项目中使用OSSClient就非常方便: 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 endend 然后编辑views/buckets/index.html.erb,将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> 其中bucket_objects_path是一个辅助函数,在app/helpers/buckets_helper.rb中: module BucketsHelper def bucket_objects_path(bucket_name) "/buckets/#{bucket_name}/objects" endend 这样就完成了列出所有Bucket的功能。在运行之前,我们还需要配置Rails的路由,使得我们在浏览器中输入的地址能够调用正确的逻辑。编辑config/routes.rb,增加一条: resources :buckets do resources :objectsend好了,在oss-manager/下输入rails s以启动rails server,然后在浏览器中输入http://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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://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这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑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" /> <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,然后访问http://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 id="main"> <%= 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代码请参看 Alibaba Cloud OSS Rails Demo。

2019-12-01 23:14:34 0 浏览量 回答数 0

回答

可使用使用函数TABLE_EXISTS,查询指定的表是否存在。 使用函数PARTITION_EXISTS,查询指定的分区是否存在。 具体函数说明可参考: https://help.aliyun.com/document_detail/48976.html 如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接

montos 2020-05-27 21:35:10 0 浏览量 回答数 0

问题

oss c sdk列出bucket下面的object提示SignatureDoesNotMatch

zxywd 2019-12-01 21:52:21 5259 浏览量 回答数 2

回答

您好,有两种方式。一种是使用表的生命周期,语法ALTER TABLE table_name SET lifecycle days;如果 table_name 是分区表,则根据各分区的 LastDataModifiedTime 判断该分区是否该被回收。另一种方式是:您可以通过创建一个sql脚本定期删除分区,定时操作。删除命令例如alter table sale_detail drop if exists partition(sale_date='201312');yyyymmdd,(pt=dateadd(${bdp.system.bizdate},-9,'dd')),dateadd函数中${bdp.system.bizdate}需要是datetime类型,格式需要是 2017-08-29 14:12:54 这种${bdp.system.bizdate}是yyyymmdd。您可以根据需要需要,设置自定义的时间参数,参考文档下方自定义参数https://help.aliyun.com/document_detail/30281.html?spm=5176.doc52330.6.604.tn0odl

琴瑟 2019-12-02 00:19:45 0 浏览量 回答数 0

问题

php制作图片验证码echo $url和echo file_get_content($url)的区别

河南 2019-12-01 19:51:16 1864 浏览量 回答数 1

回答

您需要使用以下LAST_INSERT_ID()功能:http : //dev.mysql.com/doc/refman/5.0/zh-CN/information-functions.html#function_last-insert-id 例如: INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...); SELECT LAST_INSERT_ID(); 这将让你背PRIMARY KEY的最后一排的价值你插入: 生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。 因此,通过返回的值LAST_INSERT_ID()是每用户是不会受到影响的,可能在服务器上运行的其他查询其他用户。来源:stack overflow

保持可爱mmm 2020-05-10 23:13:25 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首先生成一个管理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 => '/') endend 上面的代码首先从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 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> 上面的代码将文件按目录结构显示,主要逻辑是: 总是在第一个显示’../‘指向上级目录对于Common prefix,显示为目录对于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)}" endend 完成之后运行rails s,然后在浏览器中输入地址http://localhost:3000/buckets/my-bucket/objects/就可以查看文件列表了。 惯例保存代码:

2019-12-01 23:14:36 0 浏览量 回答数 0

问题

PHP Database ODBC

ethnicity 2019-12-01 22:08:31 7202 浏览量 回答数 0

问题

ip_conntrack: table full, dropping packet 现象解决

a123456678 2019-12-01 19:52:48 1277 浏览量 回答数 1

回答

支持,使用tablefunc插件来实现,如下: 一般在提交报表的时候,可能会使用到对数据表的行列变换的需求。 如以下数据: digoal=> select * from tbl_sellers_info order by seller,se_year,se_month; seller | se_year | se_month | se_amount ----------+---------+----------+----------- 卡洛斯 | 2011 | 3 | 12 卡洛斯 | 2011 | 4 | 45 卡洛斯 | 2011 | 5 | 56 德哥 | 2010 | 1 | 123456 德哥 | 2010 | 2 | 234567 德哥 | 2010 | 3 | 345678 德哥 | 2010 | 4 | 345678 德哥 | 2010 | 5 | 567890 德哥 | 2010 | 6 | 123456 德哥 | 2010 | 7 | 234567 德哥 | 2010 | 8 | 345678 德哥 | 2010 | 9 | 345678 德哥 | 2010 | 10 | 567890 德哥 | 2010 | 11 | 123456 德哥 | 2010 | 12 | 234567 德哥 | 2011 | 1 | 123456 德哥 | 2011 | 2 | 234567 德哥 | 2011 | 3 | 345678 德哥 | 2011 | 4 | 345678 德哥 | 2011 | 5 | 567890 罗纳尔多 | 2011 | 2 | 20 罗纳尔多 | 2011 | 3 | 30 罗纳尔多 | 2011 | 4 | 40 罗纳尔多 | 2011 | 5 | 50 贝克汉姆 | 2010 | 11 | 12 贝克汉姆 | 2010 | 12 | 23 贝克汉姆 | 2011 | 1 | 12 贝克汉姆 | 2011 | 2 | 23 贝克汉姆 | 2011 | 3 | 34 贝克汉姆 | 2011 | 4 | 45 贝克汉姆 | 2011 | 5 | 56 (31 rows) 例如要按照每个SELLER出具每年的月度销售情况,可能要转换成: 图1 在PostgreSQL9.1里面有一个比较好用的extension,tablefunc,可以轻松的完成行列转换。 下面会有例子来简单的描述以下这个extension. 1. 安装tablefunc extension. \c digoal postgres You are now connected to database "digoal" as user "postgres". digoal=# create extension tablefunc; CREATE EXTENSION digoal=# \c digoal digoal You are now connected to database "digoal" as user "digoal". #安装完后会创建几个TYPE,几个函数. type: CREATE TYPE tablefunc_crosstab_N AS ( row_name TEXT, category_1 TEXT, category_2 TEXT, . . . category_N TEXT ); public | tablefunc_crosstab_2 | tablefunc_crosstab_2 | tuple | | public | tablefunc_crosstab_3 | tablefunc_crosstab_3 | tuple | | public | tablefunc_crosstab_4 | tablefunc_crosstab_4 | tuple | | function normal_rand(int numvals, float8 mean, float8 stddev) returns setof float8 crosstab(text sql) crosstab(text sql, int N) crosstabN(text sql) crosstab(text source_sql, text category_sql) connectby(text relname, text keyid_fld, text parent_keyid_fld [, text orderby_fld ], text start_with, int max_depth [, text branch_delim ]) 2. 创建测试表 create table tbl_sellers_info (seller text,se_year int,se_month int,se_amount int); insert into tbl_sellers_info values ('德哥',2011,01,123456); insert into tbl_sellers_info values ('德哥',2011,02,234567); insert into tbl_sellers_info values ('德哥',2011,03,345678); insert into tbl_sellers_info values ('德哥',2011,04,345678); insert into tbl_sellers_info values ('德哥',2011,05,567890); insert into tbl_sellers_info values ('贝克汉姆',2011,01,12); insert into tbl_sellers_info values ('贝克汉姆',2011,02,23); insert into tbl_sellers_info values ('贝克汉姆',2011,03,34); insert into tbl_sellers_info values ('贝克汉姆',2011,04,45); insert into tbl_sellers_info values ('贝克汉姆',2011,05,56); insert into tbl_sellers_info values ('卡洛斯',2011,03,12); insert into tbl_sellers_info values ('卡洛斯',2011,04,45); insert into tbl_sellers_info values ('卡洛斯',2011,05,56); insert into tbl_sellers_info values ('罗纳尔多',2011,02,20); insert into tbl_sellers_info values ('罗纳尔多',2011,03,30); insert into tbl_sellers_info values ('罗纳尔多',2011,04,40); insert into tbl_sellers_info values ('罗纳尔多',2011,05,50); insert into tbl_sellers_info values ('德哥',2010,01,123456); insert into tbl_sellers_info values ('德哥',2010,02,234567); insert into tbl_sellers_info values ('德哥',2010,03,345678); insert into tbl_sellers_info values ('德哥',2010,04,345678); insert into tbl_sellers_info values ('德哥',2010,05,567890); insert into tbl_sellers_info values ('德哥',2010,06,123456); insert into tbl_sellers_info values ('德哥',2010,07,234567); insert into tbl_sellers_info values ('德哥',2010,08,345678); insert into tbl_sellers_info values ('德哥',2010,09,345678); insert into tbl_sellers_info values ('德哥',2010,10,567890); insert into tbl_sellers_info values ('德哥',2010,11,123456); insert into tbl_sellers_info values ('德哥',2010,12,234567); insert into tbl_sellers_info values ('贝克汉姆',2010,11,12); insert into tbl_sellers_info values ('贝克汉姆',2010,12,23); 3. 下面我们用crosstab(text source_sql, text category_sql) 来满足需求. select substr(seller,1,char_length(seller)-4) seller,substr(seller,char_length(seller)-3) se_year,jan ,feb ,mar ,apr ,may ,jun ,jul ,aug ,sep ,oct ,nov ,dec from crosstab('select seller||se_year,se_month,se_amount from tbl_sellers_info order by 1', 'select distinct se_month from tbl_sellers_info order by 1') as (seller text,Jan numeric,feb numeric,mar numeric,apr numeric,may numeric,jun numeric,jul numeric,aug numeric,sep numeric,oct numeric,nov numeric,dec numeric) order by 1,2; # 分析一下这个函数: 参数一:(这个是需要进行行列变换的源SQL) select seller||se_year,se_month,se_amount from tbl_sellers_info order by 1 参数二:(这个在这里代表的是月份,也就是se_month的值) select distinct se_month from tbl_sellers_info order by 1 或者 select * from generate_series(1,12) order by 1 出来的结果都是一样的。 输出: (seller text,Jan numeric,feb numeric,mar numeric,apr numeric,may numeric,jun numeric,jul numeric,aug numeric,sep numeric,oct numeric,nov numeric,dec numeric) seller代表的是seller||se_year,这里必须这么做,因为需要按照这个来分组. 后面的就是月份了,数据类型是和se_amount一致就行了。 输出结果就是前面提到的图片。 行记录中没有的月份在变换后该月数据为空.例如卡洛斯只有2011年的3,4,5月份有数据,那么其他月份就是空白的。 # 另外一个要注意的是,输出结果的顺序是select * from generate_series(1,12) order by 1来决定的. # 例如 select * from generate_series(1,12) order by 1 desc 那么输出的顺序就是反的,因此必须严格的排序. 图2 # 另外的几个crosstab函数用法与此类似,只不过没有这个灵活。 # 而normal_rand用于返回一系列正态分布值。connect_by用于做异构查询(前面我有写过用with rescursive来实现)。就不再演示。 参考: http://www.postgresql.org/docs/9.5/static/tablefunc.html 图1 图2

德哥 2019-12-02 01:29:26 0 浏览量 回答数 0

问题

如何使用函数计算

云栖大讲堂 2019-12-01 20:56:05 1691 浏览量 回答数 0

问题

PHP MySQL Insert Into

ethnicity 2019-12-01 22:08:29 7684 浏览量 回答数 0

问题

Ruby-SDK之如何实现Rails应用?

青衫无名 2019-12-01 21:46:56 1481 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在Rails这种服务端应用中,用户上传文件有两种办法: 用户先将文件上传到Rails的服务器上,服务器再将文件上传到OSS。这样做需要Rails服务器作为中转,文件多拷贝了一遍,不是很高效。服务器为用户生成表单和临时凭证,用户直接上传文件到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 => 'http://localhost:3000/buckets/' }end 然后编辑app/views/objects/new.html.erb: <%= 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>&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,然后访问http://localhost:3000/buckets/my-bucket/objects/new就能够上传文件了。 最后记得保存代码:

2019-12-01 23:14:36 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播