DEV Community

jigarshah8055
jigarshah8055

Posted on

1

Password Protected Zip Using Ruby on Rails

This blog will guide you on how to create a Ruby on Rails application and add rubyzip which used to make zip files with Password Protection.

Let’s have a brief introduction about Password Protection using rubyzip. If you are familiar with rubyzip and Password Protection then directly go to Implementation section.

What is rubyzip ?

  • It’s a ruby gem (library) which is used to read and write zip files.
  • rubyzip provide you the power of reading and writing zip files and also make password protected zip files.

Why rubyzip?

  • rubyzip provides traditional password protection.

Requirements

  • Ruby 1.9.2 or greater

Technology Stack

get started

Implementation

  • Create a new rails app

    rails new zipper --database=postgresql

  • Now put gem in the gemfile as

    gem 'rubyzip', '>= 1.0.0'

    Don’t forget to bundle ;)

  • Generate a controller with the create and new method

    rails g controller zipping_folders new

  • Simply set the root path to zipping_folders new method and make resource path for only create method in routes.rb

    resources :zipping_folders, only: [:create]
    root ‘zipping_folders#new’

  • Now make a form in new.html.erb with one file tag to choose files and two input fields which define zip file name and password respectively.

    <h1>Welcome to Create Password Protected Zip</h1>
    <%= form_tag zipping_folders_path, method: :post, multipart: true do %>
    <%= label_tag 'Content', 'Select Files' %>
    <%= file_field_tag('files[]', multiple: true, class: 'drop-target') %>
    <%= label_tag 'Zip Name', 'Zip Name' %>
    <%= text_field_tag 'out_name' %>
    <%= label_tag 'Password', 'Password' %>
    <%= password_field_tag 'password' %>
    <%= submit_tag 'Generate!' %>
    <% end %>
    view raw new.html.erb hosted with ❤ by GitHub
  • You have to write below code in zipping_folders_controller.rb.

    require 'rubygems'
    require 'zip'
    class ZippingFoldersController < ApplicationController
    def new; end
    def create
    if params[:files].present?
    get_variables_for_zip(params)
    buffer = Zip::OutputStream.write_buffer(::StringIO.new(''), Zip::TraditionalEncrypter.new(@password)) do |out|
    @input_filenames.each do |filename|
    out.put_next_entry(filename)
    out.write File.open("#{@folder}/#{filename}").read
    end
    end
    File.open(@zipfile_name, 'wb') {|f| f.write(buffer.string) }
    buffer.rewind
    send_data buffer.read, filename: "#{@zipfile_name}.zip"
    end
    end
    private
    def get_variables_for_zip(params)
    @input_filenames = []
    params[:files].select {|f| @input_filenames << f.path.gsub('/tmp/', '') }
    @folder = "/tmp/"
    @zipfile_name = params[:out_name]
    @password = params[:password]
    end
    end

Bingooo!!! That's it..!!!

  • Start your rails server and check it on localhost.

You can find complete code on

https://github.com/jigarshah8055/zipper

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs