RoR Resume Uploader App

minio_ROR1

本示例将会指导你使用Ruby on Rails和Minio Server构建一个简单的app。我们将学习如何在我们的rails app中使用aws-sdk上传对象到一个Minio Server上。你可以通过这里获取完整的代码,代码是以Apache 2.0 License发布的。

1. 前提条件

按下面所示获取代码,并调用bundle install。

  1. git clone https://github.com/minio/ror-resumeuploader-app
  2. cd ror-resumeuploader-app
  3. bundle install

除了rails应用需要的的所有的标准gem外,添加一个aws-sdk v2 gem到Gemfile中。

  1. source 'https://rubygems.org'
  2. # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
  3. gem 'rails', '4.2.4'
  4. # Use sqlite3 as the database for Active Record
  5. gem 'sqlite3'
  6. # Use SCSS for stylesheets
  7. gem 'sass-rails', '~> 5.0'
  8. # Use Uglifier as compressor for JavaScript assets
  9. gem 'uglifier', '>= 1.3.0'
  10. # Use CoffeeScript for .coffee assets and views
  11. gem 'coffee-rails', '~> 4.1.0'
  12. # See https://github.com/rails/execjs#readme for more supported runtimes
  13. # gem 'therubyracer', platforms: :ruby
  14. # Use jquery as the JavaScript library
  15. gem 'jquery-rails'
  16. # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
  17. gem 'turbolinks'
  18. # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
  19. gem 'jbuilder', '~> 2.0'
  20. # bundle exec rake doc:rails generates the API under doc/api.
  21. gem 'sdoc', '~> 0.4.0', group: :doc
  22. group :development, :test do
  23. # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  24. gem 'byebug'
  25. end
  26. group :development do
  27. # Access an IRB console on exception pages or by using <%= console %> in views
  28. gem 'web-console', '~> 2.0'
  29. # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  30. gem 'spring'
  31. end
  32. # Add the aws sdk gem
  33. gem 'aws-sdk', '~> 2'

注意: 如果是在Ubuntu上运行这个示例,请添加therubyracer gem。

4. 设置存储桶

我们已经创建了一个公开的Minio Server(https://play.minio.io:9000) 供大家进行开发和测试。Minio Client mc已经预设好和play server的配置。调用mc mb命令,在play.minio.io:9000上创建一个名叫resumes的存储桶。

  1. mc mb play/resumes

5. 配置AWS SDK连接Minio Server

添加一个名叫aws.rb的初始化文件,并按下面所示设置好连接Minio Server的认证信息。在本示例中我们使用的是Minio的公开服务https://play.minio.io:9000 ,你也可以改成你自己的。

  1. Aws.config.update(
  2. region: 'us-east-1',
  3. endpoint: "https://play.minio.io:9000",
  4. force_path_style: true,
  5. credentials: Aws::Credentials.new(
  6. "Q3AM3UQ867SPQQA43P2F",
  7. "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
  8. )
  9. )

注意 - 如果服务用的是http而不是https的话,加上sslEnabled: false配置。

6. 上传对象

  • 在controller中require 'aws-sdk'。
  • 创建一个key用于持有文件对象的名称。我们会将这个写到数据库中。
  • 设置存储桶名称和key。
  • 使用upload_file存储文件内容。
    由于Minio Server与AWS S3完美兼容,所以它能与aws-sdk无缝对接。
  1. class UploadsController < ApplicationController
  2. require 'aws-sdk'
  3. def new
  4. end
  5. def create
  6. # Create a new s3 resource with a new s3 client.
  7. s3 = Aws::S3::Resource.new(Aws::S3::Client.new)
  8. # Create a key.
  9. key = File.basename params[:file].path
  10. # Set the bucket and the key.
  11. obj = s3.bucket("resumes").object(params[:file].original_filename)
  12. # Upload the file.
  13. obj.upload_file(params[:file].open)
  14. # Save the uploaded details to the local database.
  15. @upload = Upload.new(
  16. url: obj.public_url,
  17. name: obj.key
  18. )
  19. if @upload.save
  20. redirect_to uploads_path, success: 'File successfully uploaded'
  21. else
  22. flash.now[:notice] = 'There was an error'
  23. render :new
  24. end
  25. end
  26. def index
  27. @uploads = Upload.all
  28. end
  29. end

注意: 在这个例子中,我们使用aws-sdk库提供的upload_file api来完成上传过程。 如果我们想要在view上处理上传,我们会将文件发布到一个能够接受我们的POST提交的presigned URL。

7. 创建Views

创建一个可以做multipart upload的form。我们将使用file_field_tag来从本地选择文件,submit tag来提供form到upload controller进行处理。

  1. <div class="col-offset-lg-2 col-lg-12">
  2. <h1>Upload your Resume</h1>
  3. <div class="well" style="background-color: #EFE0D5;">
  4. <%= form_tag uploads_path, :html => {:multipart => true}, enctype: 'multipart/form-data' do %>
  5. <%= file_field_tag :file %> <br/>
  6. <%= submit_tag 'Upload file' , :class=>"btn btn-block btn-danger" %>
  7. <% end %>
  8. </div>
  9. </div>

8. 运行App

你可以从这里获取完整的代码。按下面所示启动这个rails服务。

  1. rake db:migrate
  2. rails s

现在如果你访问http://localhost:3000 ,你应该可以看到这个示例程序。

9. Explore Further

原文: https://docs.minio.io/cn/ror-resume-uploader-app.html