Skip to content

Ruby on Rails

File Upload

The following code example illustrates how to handle file upload on your server using Ruby as a server-side language. For step by step explanation of the upload flow see file upload concept.


The main index page.

<!DOCTYPE html>
  <meta charset="utf-8">

  <!-- Include external CSS. -->
  <link href="" rel="stylesheet" type="text/css" />
  <link rel="stylesheet" href="">

  <!-- Include Editor style. -->
  <link href="[email protected]/css/froala_editor.pkgd.min.css" rel="stylesheet" type="text/css" />
  <link href="[email protected]/css/froala_style.min.css" rel="stylesheet" type="text/css" />

  <!-- Include external JS libs. -->
  <script type="text/javascript" src=""></script>
  <script type="text/javascript" src=""></script>
  <script type="text/javascript" src=""></script>

  <!-- Include Editor JS files. -->
  <script type="text/javascript" src="[email protected]//js/froala_editor.pkgd.min.js"></script>
  <div class="sample">
    <h2>File upload example.</h2>
      <textarea id="edit" name="content"></textarea>

  <!-- Initialize the editor. -->
    $(function() {
        // Set the file upload URL.
        fileUploadURL: '/upload_file',

        fileUploadParams: {
          id: 'my_editor'


upload_controller.rb file will manage the upload part. It has basic file format validations this can be easily extended.

The uploads directory will be automatically created if it dose not exist under public/uploads/files

After processing the uploaded file, if it passes the validation, the server will respond with a JSON object containing a link to the uploaded file.

E.g.: {"link":"http://server_address/download_file/name_of_file"}.

class UploadController < ActionController::Base

  FILE_EXT = [".txt", ".pdf", ".doc"]

  def upload_file
    if params[:file]

      ext = File.extname(params[:file].original_filename)
      ext = file_validation(ext)
      file_name = "#{SecureRandom.urlsafe_base64}#{ext}"
      path = Rails.root.join("public/uploads/files/", file_name), "wb") {|f| f.write(params[:file].read)}
      view_file = Rails.root.join("/download_file/", file_name).to_s
      render :json => {:link => view_file}.to_json

      render :text => {:link => nil}.to_json

  def file_validation(ext)
    raise "Not allowed" unless FILE_EXT.include?(ext)

  def access_file
    if File.exists?(Rails.root.join("public", "uploads", "files", params[:name]))
      send_data"public", "uploads", "files", params[:name])), :disposition => "attachment"
      render :nothing => true

routes.rb file will manage the routing part.

Inside this file you need to define the routes for the POST file upload and the GET uploaded file requests

Rails.application.routes.draw do
# For details on the DSL available within this file, see

post "/upload_file" => "upload#upload_file", :as => :upload_file
get "/download_file/:name" => "upload#access_file", :as => :upload_access_file, :name => /.*/