Days
Hours
Minutes
Seconds
x

Froala Editor v4.1.4 is Here LEARN MORE

Skip to content

Ruby on Rails

Image Upload

The following sections describe how to handle image uploads on your server using Ruby as a server-side language. For information on the upload workflow refer to the image upload documentation.

Frontend

Settiong up the index page.

  1. On the head section include the Editor style.

  2. <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      
      <link href="https://cdn.jsdelivr.net/npm/froala-editor@latest/css/froala_editor.pkgd.min.css" rel="stylesheet" type="text/css" />
      </head>
  3. On the body section include the Editor JS files and define the area for the editor.

  4.   <body>  
      <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/froala-editor@latest/js/froala_editor.pkgd.min.js"></script>
      
      <div class="sample">
      <h2>Image upload example.</h2>
      <form>
      <textarea id="edit" name="content"></textarea>
      </form>
      </div>
      
  5. Initialize the editor and set the image upload URL

  6.   <script>
      new FroalaEditor('#edit', {
      // Set the image upload URL.
      imageUploadURL: '/UploadFiles',
      
      imageUploadParams: {
      id: 'my_editor'
      }
      })
      </script>
      </body>
      </html>

The full code should look like this:

<!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <link href="https://cdn.jsdelivr.net/npm/froala-editor@latest/css/froala_editor.pkgd.min.css" rel="stylesheet" type="text/css" />
    </head>
    
    <body>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/froala-editor@latest/js/froala_editor.pkgd.min.js"></script>
    
    <div class="sample">
    <h2>Image upload example.</h2>
    <form>
    <textarea id="edit" name="content"></textarea>
    </form>
    </div>
    
    
    <script>
    new FroalaEditor('#edit', {
    
    imageUploadURL: '/UploadFiles',
    
    fileUploadParams: {
    id: 'my_editor'
    }
    })
    </script>
    </body>
    </html>

Backend

upload_controller.rb handles the upload part. It has basic image format validations that can be easily extended.

The uploads directory is created automatically if it does not exist under public/uploads/files

If the uploaded image passes the validation step, the server responds 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
  
  IMAGE_EXT = [".gif", ".jpeg", ".jpg", ".png", ".svg"]
  
  def upload_image
  if params[:file]
  FileUtils::mkdir_p(Rails.root.join("public/uploads/files"))
  
  ext = File.extname(params[:file].original_filename)
  ext = image_validation(ext)
  file_name = "#{SecureRandom.urlsafe_base64}#{ext}"
  path = Rails.root.join("public/uploads/files/", file_name)
  
  File.open(path, "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
  
  else
  render :text => {:link => nil}.to_json
  end
  end
  
  def image_validation(ext)
  raise "Not allowed" unless IMAGE_EXT.include?(ext)
  end
  
  def access_file
  if File.exists?(Rails.root.join("public", "uploads", "files", params[:name]))
  send_data File.read(Rails.root.join("public", "uploads", "files", params[:name])), :disposition => "attachment"
  else
  render :nothing => true
  end
  end
  end
  

routes.rb handles the routing part.

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

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  
  post "/upload_image" => "upload#upload_image", :as => :upload_image
  get "/download_file/:name" => "upload#access_file", :as => :upload_access_file, :name => /.*/

Do you think we can improve this article? Let us know.

[class^="wpforms-"]
[class^="wpforms-"]
[bws_google_captcha]
<div class="gglcptch gglcptch_v2"><div id="gglcptch_recaptcha_493107725" class="gglcptch_recaptcha"></div> <noscript> <div style="width: 302px;"> <div style="width: 302px; height: 422px; position: relative;"> <div style="width: 302px; height: 422px; position: absolute;"> <iframe src="https://www.google.com/recaptcha/api/fallback?k=6Ld6lNoUAAAAAM626LfCOrnkBFJtYZAKESFCjgv_" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe> </div> </div> <div style="border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px; height: 60px; width: 300px;"> <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px !important; height: 40px !important; border: 1px solid #c1c1c1 !important; margin: 10px 25px !important; padding: 0px !important; resize: none !important;"></textarea> </div> </div> </noscript></div>
[class^="wpforms-"]
[class^="wpforms-"]
[bws_google_captcha]
<div class="gglcptch gglcptch_v2"><div id="gglcptch_recaptcha_1097332002" class="gglcptch_recaptcha"></div> <noscript> <div style="width: 302px;"> <div style="width: 302px; height: 422px; position: relative;"> <div style="width: 302px; height: 422px; position: absolute;"> <iframe src="https://www.google.com/recaptcha/api/fallback?k=6Ld6lNoUAAAAAM626LfCOrnkBFJtYZAKESFCjgv_" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe> </div> </div> <div style="border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px; height: 60px; width: 300px;"> <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px !important; height: 40px !important; border: 1px solid #c1c1c1 !important; margin: 10px 25px !important; padding: 0px !important; resize: none !important;"></textarea> </div> </div> </noscript></div>
[class^="wpforms-"]
[class^="wpforms-"]
[bws_google_captcha]
<div class="gglcptch gglcptch_v2"><div id="gglcptch_recaptcha_182837717" class="gglcptch_recaptcha"></div> <noscript> <div style="width: 302px;"> <div style="width: 302px; height: 422px; position: relative;"> <div style="width: 302px; height: 422px; position: absolute;"> <iframe src="https://www.google.com/recaptcha/api/fallback?k=6Ld6lNoUAAAAAM626LfCOrnkBFJtYZAKESFCjgv_" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe> </div> </div> <div style="border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px; height: 60px; width: 300px;"> <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px !important; height: 40px !important; border: 1px solid #c1c1c1 !important; margin: 10px 25px !important; padding: 0px !important; resize: none !important;"></textarea> </div> </div> </noscript></div>