├── .gitignore
├── Gemfile
├── Gemfile.lock
├── Procfile
├── README.md
├── Rakefile
├── app
├── assets
│ ├── images
│ │ └── .keep
│ ├── javascripts
│ │ └── application.js
│ └── stylesheets
│ │ └── application.css.scss
├── controllers
│ ├── application_controller.rb
│ ├── concerns
│ │ └── .keep
│ └── photos_controller.rb
├── helpers
│ └── application_helper.rb
├── mailers
│ └── .keep
├── models
│ ├── .keep
│ ├── concerns
│ │ └── .keep
│ └── photo.rb
└── views
│ ├── layouts
│ └── application.html.erb
│ └── photos
│ ├── _photo.html.erb
│ ├── create.js.erb
│ ├── new.html.erb
│ └── new_multiple.html.erb
├── bin
├── bundle
├── rails
└── rake
├── config.ru
├── config
├── application.rb
├── boot.rb
├── database.yml
├── environment.rb
├── environments
│ ├── development.rb
│ ├── production.rb
│ └── test.rb
├── initializers
│ ├── backtrace_silencers.rb
│ ├── cookies_serializer.rb
│ ├── dragonfly.rb
│ ├── filter_parameter_logging.rb
│ ├── inflections.rb
│ ├── mime_types.rb
│ ├── session_store.rb
│ └── wrap_parameters.rb
├── locales
│ └── en.yml
├── routes.rb
└── secrets.yml
├── db
├── migrate
│ ├── 20140618095323_create_photos.rb
│ └── 20140618110804_add_author_and_image_name_to_photos.rb
├── schema.rb
└── seeds.rb
├── lib
├── assets
│ └── .keep
└── tasks
│ └── .keep
├── log
└── .keep
├── public
├── 404.html
├── 422.html
├── 500.html
├── favicon.ico
└── robots.txt
└── vendor
└── assets
├── javascripts
└── .keep
└── stylesheets
└── .keep
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2 | #
3 | # If you find yourself ignoring temporary files generated by your text editor
4 | # or operating system, you probably want to add a global ignore instead:
5 | # git config --global core.excludesfile '~/.gitignore_global'
6 |
7 | # Ignore bundler config.
8 | /.bundle
9 |
10 | # Ignore the default SQLite database.
11 | /db/*.sqlite3
12 | /db/*.sqlite3-journal
13 |
14 | # Ignore all logfiles and tempfiles.
15 | /log/*.log
16 | /tmp
17 |
18 | .idea/
19 | /public/system/dragonfly/development
20 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
4 | gem 'rails', '4.1.9'
5 |
6 | gem 'thin'
7 |
8 | gem 'heroku_secrets', github: 'alexpeattie/heroku_secrets'
9 |
10 | gem 'dragonfly'
11 | gem 'dragonfly-s3_data_store'
12 | gem 'bootstrap-sass'
13 | gem 'remotipart', '~> 1.2'
14 | gem 'jquery-fileupload-rails', github: 'Springest/jquery-fileupload-rails'
15 |
16 | gem 'compass-rails'
17 | gem 'compass'
18 |
19 | group :development do
20 | gem 'sqlite3'
21 | gem 'better_errors'
22 | gem 'binding_of_caller'
23 | end
24 |
25 | group :production do
26 | gem 'pg'
27 | gem 'rails_12factor'
28 | gem 'rack-cache'
29 | end
30 |
31 | # Use SCSS for stylesheets
32 | gem 'sass-rails', '~> 5.0.0'
33 | # Use Uglifier as compressor for JavaScript assets
34 | gem 'uglifier', '>= 1.3.0'
35 | # Use CoffeeScript for .js.coffee assets and views
36 | gem 'coffee-rails', '~> 4.1.0'
37 | # See https://github.com/sstephenson/execjs#readme for more supported runtimes
38 | # gem 'therubyracer', platforms: :ruby
39 |
40 | # Use jquery as the JavaScript library
41 | gem 'jquery-rails'
42 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
43 | gem 'turbolinks'
44 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
45 | gem 'jbuilder', '~> 2.0'
46 | # bundle exec rake doc:rails generates the API under doc/api.
47 | gem 'sdoc', '~> 0.4.0', group: :doc
48 |
49 | # Use ActiveModel has_secure_password
50 | # gem 'bcrypt', '~> 3.1.7'
51 |
52 | # Use unicorn as the app server
53 | # gem 'unicorn'
54 |
55 | # Use Capistrano for deployment
56 | # gem 'capistrano-rails', group: :development
57 |
58 | # Use debugger
59 | # gem 'debugger', group: [:development, :test]
60 |
61 | # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
62 | gem 'tzinfo-data', platforms: [:mingw, :mswin]
63 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GIT
2 | remote: git://github.com/Springest/jquery-fileupload-rails.git
3 | revision: 2ebfdf1cc9a768f36420aaad9668ba68f2a5943b
4 | specs:
5 | jquery-fileupload-rails (0.4.2)
6 | actionpack (>= 4)
7 | railties (>= 4)
8 |
9 | GIT
10 | remote: git://github.com/alexpeattie/heroku_secrets.git
11 | revision: 717af8e0acf399bc88d2c8c1a7e230023942af0f
12 | specs:
13 | heroku_secrets (0.0.2)
14 |
15 | GEM
16 | remote: https://rubygems.org/
17 | specs:
18 | CFPropertyList (2.3.0)
19 | actionmailer (4.1.9)
20 | actionpack (= 4.1.9)
21 | actionview (= 4.1.9)
22 | mail (~> 2.5, >= 2.5.4)
23 | actionpack (4.1.9)
24 | actionview (= 4.1.9)
25 | activesupport (= 4.1.9)
26 | rack (~> 1.5.2)
27 | rack-test (~> 0.6.2)
28 | actionview (4.1.9)
29 | activesupport (= 4.1.9)
30 | builder (~> 3.1)
31 | erubis (~> 2.7.0)
32 | activemodel (4.1.9)
33 | activesupport (= 4.1.9)
34 | builder (~> 3.1)
35 | activerecord (4.1.9)
36 | activemodel (= 4.1.9)
37 | activesupport (= 4.1.9)
38 | arel (~> 5.0.0)
39 | activesupport (4.1.9)
40 | i18n (~> 0.6, >= 0.6.9)
41 | json (~> 1.7, >= 1.7.7)
42 | minitest (~> 5.1)
43 | thread_safe (~> 0.1)
44 | tzinfo (~> 1.1)
45 | addressable (2.3.6)
46 | arel (5.0.1.20140414130214)
47 | autoprefixer-rails (5.1.1)
48 | execjs
49 | json
50 | better_errors (2.1.1)
51 | coderay (>= 1.0.0)
52 | erubis (>= 2.6.6)
53 | rack (>= 0.9.0)
54 | binding_of_caller (0.7.2)
55 | debug_inspector (>= 0.0.1)
56 | bootstrap-sass (3.3.3)
57 | autoprefixer-rails (>= 5.0.0.1)
58 | sass (>= 3.2.19)
59 | builder (3.2.2)
60 | chunky_png (1.3.3)
61 | coderay (1.1.0)
62 | coffee-rails (4.1.0)
63 | coffee-script (>= 2.2.0)
64 | railties (>= 4.0.0, < 5.0)
65 | coffee-script (2.3.0)
66 | coffee-script-source
67 | execjs
68 | coffee-script-source (1.9.0)
69 | compass (1.0.3)
70 | chunky_png (~> 1.2)
71 | compass-core (~> 1.0.2)
72 | compass-import-once (~> 1.0.5)
73 | rb-fsevent (>= 0.9.3)
74 | rb-inotify (>= 0.9)
75 | sass (>= 3.3.13, < 3.5)
76 | compass-core (1.0.3)
77 | multi_json (~> 1.0)
78 | sass (>= 3.3.0, < 3.5)
79 | compass-import-once (1.0.5)
80 | sass (>= 3.2, < 3.5)
81 | compass-rails (2.0.4)
82 | compass (~> 1.0.0)
83 | sass-rails (<= 5.0.1)
84 | sprockets (< 2.13)
85 | daemons (1.1.9)
86 | debug_inspector (0.0.2)
87 | dragonfly (1.0.7)
88 | addressable (~> 2.3)
89 | multi_json (~> 1.0)
90 | rack
91 | dragonfly-s3_data_store (1.0.4)
92 | dragonfly (~> 1.0)
93 | fog
94 | erubis (2.7.0)
95 | eventmachine (1.0.4)
96 | excon (0.44.0)
97 | execjs (2.2.2)
98 | ffi (1.9.6)
99 | ffi (1.9.6-x86-mingw32)
100 | fission (0.5.0)
101 | CFPropertyList (~> 2.2)
102 | fog (1.27.0)
103 | fog-atmos
104 | fog-aws (~> 0.0)
105 | fog-brightbox (~> 0.4)
106 | fog-core (~> 1.27, >= 1.27.3)
107 | fog-ecloud
108 | fog-json
109 | fog-profitbricks
110 | fog-radosgw (>= 0.0.2)
111 | fog-sakuracloud (>= 0.0.4)
112 | fog-serverlove
113 | fog-softlayer
114 | fog-storm_on_demand
115 | fog-terremark
116 | fog-vmfusion
117 | fog-voxel
118 | fog-xml (~> 0.1.1)
119 | ipaddress (~> 0.5)
120 | nokogiri (~> 1.5, >= 1.5.11)
121 | fog-atmos (0.1.0)
122 | fog-core
123 | fog-xml
124 | fog-aws (0.0.8)
125 | fog-core (~> 1.27)
126 | fog-json (~> 1.0)
127 | fog-xml (~> 0.1)
128 | ipaddress (~> 0.8)
129 | fog-brightbox (0.7.1)
130 | fog-core (~> 1.22)
131 | fog-json
132 | inflecto (~> 0.0.2)
133 | fog-core (1.28.0)
134 | builder
135 | excon (~> 0.38)
136 | formatador (~> 0.2)
137 | mime-types
138 | net-scp (~> 1.1)
139 | net-ssh (>= 2.1.3)
140 | fog-ecloud (0.0.2)
141 | fog-core
142 | fog-xml
143 | fog-json (1.0.0)
144 | multi_json (~> 1.0)
145 | fog-profitbricks (0.0.1)
146 | fog-core
147 | fog-xml
148 | nokogiri
149 | fog-radosgw (0.0.3)
150 | fog-core (>= 1.21.0)
151 | fog-json
152 | fog-xml (>= 0.0.1)
153 | fog-sakuracloud (1.0.0)
154 | fog-core
155 | fog-json
156 | fog-serverlove (0.1.1)
157 | fog-core
158 | fog-json
159 | fog-softlayer (0.4.0)
160 | fog-core
161 | fog-json
162 | fog-storm_on_demand (0.1.0)
163 | fog-core
164 | fog-json
165 | fog-terremark (0.0.3)
166 | fog-core
167 | fog-xml
168 | fog-vmfusion (0.0.1)
169 | fission
170 | fog-core
171 | fog-voxel (0.0.2)
172 | fog-core
173 | fog-xml
174 | fog-xml (0.1.1)
175 | fog-core
176 | nokogiri (~> 1.5, >= 1.5.11)
177 | formatador (0.2.5)
178 | hike (1.2.3)
179 | i18n (0.7.0)
180 | inflecto (0.0.2)
181 | ipaddress (0.8.0)
182 | jbuilder (2.2.6)
183 | activesupport (>= 3.0.0, < 5)
184 | multi_json (~> 1.2)
185 | jquery-rails (3.1.2)
186 | railties (>= 3.0, < 5.0)
187 | thor (>= 0.14, < 2.0)
188 | json (1.8.2)
189 | mail (2.6.3)
190 | mime-types (>= 1.16, < 3)
191 | mime-types (2.4.3)
192 | mini_portile (0.6.2)
193 | minitest (5.5.1)
194 | multi_json (1.10.1)
195 | net-scp (1.2.1)
196 | net-ssh (>= 2.6.5)
197 | net-ssh (2.9.2)
198 | nokogiri (1.6.6.2)
199 | mini_portile (~> 0.6.0)
200 | nokogiri (1.6.6.2-x86-mingw32)
201 | mini_portile (~> 0.6.0)
202 | pg (0.18.1)
203 | pg (0.18.1-x86-mingw32)
204 | rack (1.5.2)
205 | rack-cache (1.2)
206 | rack (>= 0.4)
207 | rack-test (0.6.3)
208 | rack (>= 1.0)
209 | rails (4.1.9)
210 | actionmailer (= 4.1.9)
211 | actionpack (= 4.1.9)
212 | actionview (= 4.1.9)
213 | activemodel (= 4.1.9)
214 | activerecord (= 4.1.9)
215 | activesupport (= 4.1.9)
216 | bundler (>= 1.3.0, < 2.0)
217 | railties (= 4.1.9)
218 | sprockets-rails (~> 2.0)
219 | rails_12factor (0.0.3)
220 | rails_serve_static_assets
221 | rails_stdout_logging
222 | rails_serve_static_assets (0.0.4)
223 | rails_stdout_logging (0.0.3)
224 | railties (4.1.9)
225 | actionpack (= 4.1.9)
226 | activesupport (= 4.1.9)
227 | rake (>= 0.8.7)
228 | thor (>= 0.18.1, < 2.0)
229 | rake (10.4.2)
230 | rb-fsevent (0.9.4)
231 | rb-inotify (0.9.5)
232 | ffi (>= 0.5.0)
233 | rdoc (4.2.0)
234 | json (~> 1.4)
235 | remotipart (1.2.1)
236 | sass (3.4.11)
237 | sass-rails (5.0.1)
238 | railties (>= 4.0.0, < 5.0)
239 | sass (~> 3.1)
240 | sprockets (>= 2.8, < 4.0)
241 | sprockets-rails (>= 2.0, < 4.0)
242 | tilt (~> 1.1)
243 | sdoc (0.4.1)
244 | json (~> 1.7, >= 1.7.7)
245 | rdoc (~> 4.0)
246 | sprockets (2.12.3)
247 | hike (~> 1.2)
248 | multi_json (~> 1.0)
249 | rack (~> 1.0)
250 | tilt (~> 1.1, != 1.3.0)
251 | sprockets-rails (2.2.4)
252 | actionpack (>= 3.0)
253 | activesupport (>= 3.0)
254 | sprockets (>= 2.8, < 4.0)
255 | sqlite3 (1.3.10)
256 | sqlite3 (1.3.10-x86-mingw32)
257 | thin (1.6.3)
258 | daemons (~> 1.0, >= 1.0.9)
259 | eventmachine (~> 1.0)
260 | rack (~> 1.0)
261 | thor (0.19.1)
262 | thread_safe (0.3.4)
263 | tilt (1.4.1)
264 | turbolinks (2.5.3)
265 | coffee-rails
266 | tzinfo (1.2.2)
267 | thread_safe (~> 0.1)
268 | tzinfo-data (1.2015.1)
269 | tzinfo (>= 1.0.0)
270 | uglifier (2.7.0)
271 | execjs (>= 0.3.0)
272 | json (>= 1.8.0)
273 |
274 | PLATFORMS
275 | ruby
276 | x86-mingw32
277 |
278 | DEPENDENCIES
279 | better_errors
280 | binding_of_caller
281 | bootstrap-sass
282 | coffee-rails (~> 4.1.0)
283 | compass
284 | compass-rails
285 | dragonfly
286 | dragonfly-s3_data_store
287 | heroku_secrets!
288 | jbuilder (~> 2.0)
289 | jquery-fileupload-rails!
290 | jquery-rails
291 | pg
292 | rack-cache
293 | rails (= 4.1.9)
294 | rails_12factor
295 | remotipart (~> 1.2)
296 | sass-rails (~> 5.0.0)
297 | sdoc (~> 0.4.0)
298 | sqlite3
299 | thin
300 | turbolinks
301 | tzinfo-data
302 | uglifier (>= 1.3.0)
303 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: bundle exec rails server thin -p $PORT -e $RACK_ENV
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Source code for the
2 | [Asynchronous File Uploading with Rails](http://www.sitepoint.com/asynchronous-file-uploads-rails/) article on
3 | SitePoint,
4 | created by Ilya Bodrov ([bodrovis.tech](http://bodrovis.tech)).
5 |
6 | [Working demo](https://sitepoint-async-upload.herokuapp.com).
7 |
8 | # Instructions for deploying to Heroku
9 |
10 | Rename config/secrets.yml.example to config/secrets.yml
11 |
12 | Populate production section with your own aws_access_key_id and aws_secret_key.
13 |
14 | Also generate secret key for production:
15 |
16 | ```
17 | rake secrets
18 | ```
19 |
20 | and add it to config/secrets.yml
21 |
22 |
23 | Finally run:
24 |
25 | ```
26 | RAILS_ENV=production rake heroku:secrets
27 | ```
28 |
29 | Change bucket name in config/initializers/dragonfly.rb with your own bucket name.
30 | Note: Add bucket without dots to aviod [this error](https://github.com/fog/fog/issues/2381#issuecomment-28088524).
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | # Add your own tasks in files placed in lib/tasks ending in .rake,
2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3 |
4 | require File.expand_path('../config/application', __FILE__)
5 |
6 | Rails.application.load_tasks
7 |
--------------------------------------------------------------------------------
/app/assets/images/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/app/assets/images/.keep
--------------------------------------------------------------------------------
/app/assets/javascripts/application.js:
--------------------------------------------------------------------------------
1 | // This is a manifest file that'll be compiled into application.js, which will include all the files
2 | // listed below.
3 | //
4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5 | // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6 | //
7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8 | // compiled file.
9 | //
10 | // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11 | // about supported directives.
12 | //
13 | //= require jquery
14 | //= require jquery_ujs
15 | //= require turbolinks
16 | //= require bootstrap
17 | //= require jquery.remotipart
18 | //= require jquery-fileupload/basic
19 |
--------------------------------------------------------------------------------
/app/assets/stylesheets/application.css.scss:
--------------------------------------------------------------------------------
1 | @import "bootstrap";
2 | @import 'bootstrap/theme';
3 | @import "compass/css3/transition";
4 | @import "compass/css3/opacity";
5 | @import "compass/css3/border-radius";
6 |
7 | #photos-list {
8 | padding: 0;
9 | margin: 0;
10 | margin-top: 30px;
11 | clear: both;
12 | li {
13 | list-style-type: none;
14 | padding: 0;
15 | margin: 0;
16 | min-height: 272px;
17 | max-height: 272px;
18 | margin-bottom: 10px;
19 | text-align: center;
20 | img {
21 | margin-bottom: 10px;
22 | }
23 | p {
24 | margin: 0;
25 | height: 40px;
26 | overflow: hidden;
27 | }
28 | }
29 | }
30 |
31 | .progress-wrapper {
32 | display: none;
33 | }
34 |
35 | #dropzone {
36 | background: palegreen;
37 | width: 150px;
38 | text-align: center;
39 | font-weight: bold;
40 | height: 50px;
41 | line-height: 50px;
42 | border: 1px solid darken(palegreen, 10%);
43 | @include border-radius(10px);
44 | }
45 |
46 | #dropzone.in {
47 | width: 600px;
48 | height: 200px;
49 | line-height: 200px;
50 | font-size: larger;
51 | }
52 |
53 | #dropzone.hover {
54 | background: lawngreen;
55 | border: 1px solid darken(lawngreen, 10%);
56 | }
57 |
58 | #dropzone.fade {
59 | @include transition-property(all);
60 | @include transition-duration(0.5s);
61 | @include transition-timing-function(ease-out);
62 | @include opacity(1);
63 | }
64 |
65 | #footer {
66 | margin-top: 60px;
67 | }
--------------------------------------------------------------------------------
/app/controllers/application_controller.rb:
--------------------------------------------------------------------------------
1 | class ApplicationController < ActionController::Base
2 | # Prevent CSRF attacks by raising an exception.
3 | # For APIs, you may want to use :null_session instead.
4 | protect_from_forgery with: :exception
5 | end
6 |
--------------------------------------------------------------------------------
/app/controllers/concerns/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/app/controllers/concerns/.keep
--------------------------------------------------------------------------------
/app/controllers/photos_controller.rb:
--------------------------------------------------------------------------------
1 | class PhotosController < ApplicationController
2 | def new
3 | @photos = Photo.order('created_at DESC')
4 | @photo = Photo.new
5 | end
6 |
7 | def new_multiple
8 | @photos = Photo.order('created_at DESC')
9 | @photo = Photo.new
10 | end
11 |
12 | def create
13 | respond_to do |format|
14 | @photo = Photo.new(photo_params)
15 | @photo.save
16 | format.html { redirect_to new_photo_path }
17 | format.js
18 | end
19 | end
20 |
21 | private
22 |
23 | def photo_params
24 | params.require(:photo).permit(:image, :author)
25 | end
26 | end
--------------------------------------------------------------------------------
/app/helpers/application_helper.rb:
--------------------------------------------------------------------------------
1 | module ApplicationHelper
2 | end
3 |
--------------------------------------------------------------------------------
/app/mailers/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/app/mailers/.keep
--------------------------------------------------------------------------------
/app/models/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/app/models/.keep
--------------------------------------------------------------------------------
/app/models/concerns/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/app/models/concerns/.keep
--------------------------------------------------------------------------------
/app/models/photo.rb:
--------------------------------------------------------------------------------
1 | class Photo < ActiveRecord::Base
2 | dragonfly_accessor :image
3 |
4 | validates :image, presence: true
5 | validates_size_of :image, maximum: 500.kilobytes,
6 | message: "should be no more than 500 KB", if: :image_changed?
7 |
8 | validates_property :format, of: :image, in: [:jpeg, :jpg, :png, :bmp], case_sensitive: false,
9 | message: "should be either .jpeg, .jpg, .png, .bmp", if: :image_changed?
10 | end
11 |
--------------------------------------------------------------------------------
/app/views/layouts/application.html.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AsyncUploader
6 | <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
7 | <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
8 | <%= csrf_meta_tags %>
9 |
10 |
11 |
12 |
13 |
14 |
23 |
24 |
25 | - <%= link_to 'Upload one photo', root_path %>
26 | - <%= link_to 'Upload multiple photos', new_photo_multiple_path %>
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | Due to excessive amount of uploaded images I will have to remove them from time to time.
35 |
36 | Please, do not upload inappropriate content.
37 |
38 |
39 | <%= yield %>
40 |
41 |
42 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/views/photos/_photo.html.erb:
--------------------------------------------------------------------------------
1 |
2 | <%= link_to image_tag(photo.image.thumb('180x180#').url, alt: photo.image_name, class: 'img-thumbnail'),
3 | photo.image.remote_url, target: '_blank' %>
4 | <% if photo.image_name.present? %>
5 | <%= photo.image_name %>
6 | <% end %>
7 |
8 | <% if photo.author.present? %>
9 | Author: <%= photo.author %>
10 | <% end %>
11 |
--------------------------------------------------------------------------------
/app/views/photos/create.js.erb:
--------------------------------------------------------------------------------
1 | <% if @photo.new_record? %>
2 | alert('<%= @photo.image_name %> could not be uploaded: <%= j @photo.errors.full_messages.join(',
3 | ').html_safe %>');
4 | <% else %>
5 | $('#photos-list').prepend('<%= j render @photo %>');
6 | <% end %>
--------------------------------------------------------------------------------
/app/views/photos/new.html.erb:
--------------------------------------------------------------------------------
1 | List of photos
2 |
3 |
4 | <%= render @photos %>
5 |
6 |
7 | Upload one photo
8 | <%= form_for @photo, remote: true do |f| %>
9 |
10 | <%= f.label :author %>
11 | <%= f.text_field :author, class: 'form-control' %>
12 |
13 |
14 |
15 | <%= f.label :image %>
16 | <%= f.file_field :image, required: true %>
17 |
18 |
19 | <%= f.submit 'Submit', class: 'btn btn-primary btn-lg' %>
20 | <% end %>
--------------------------------------------------------------------------------
/app/views/photos/new_multiple.html.erb:
--------------------------------------------------------------------------------
1 | List of photos
2 |
3 |
4 | <%= render @photos %>
5 |
6 |
7 | Upload multiple photos
8 | Drop files here
9 |
10 | <%= form_for @photo do |f| %>
11 |
12 | <%= f.label :author %>
13 | <%= f.text_field :author, class: 'form-control' %>
14 |
15 |
16 |
17 | <%= f.label :image, 'Choose files here' %>
18 | <%= f.file_field :image, required: true, multiple: true, name: 'photo[image]' %>
19 |
20 |
21 |
29 | <% end %>
30 |
31 |
--------------------------------------------------------------------------------
/bin/bundle:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby.exe
2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3 | load Gem.bin_path('bundler', 'bundle')
4 |
--------------------------------------------------------------------------------
/bin/rails:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby.exe
2 | APP_PATH = File.expand_path('../../config/application', __FILE__)
3 | require_relative '../config/boot'
4 | require 'rails/commands'
5 |
--------------------------------------------------------------------------------
/bin/rake:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby.exe
2 | require_relative '../config/boot'
3 | require 'rake'
4 | Rake.application.run
5 |
--------------------------------------------------------------------------------
/config.ru:
--------------------------------------------------------------------------------
1 | # This file is used by Rack-based servers to start the application.
2 |
3 | require ::File.expand_path('../config/environment', __FILE__)
4 | run Rails.application
5 |
--------------------------------------------------------------------------------
/config/application.rb:
--------------------------------------------------------------------------------
1 | require File.expand_path('../boot', __FILE__)
2 |
3 | # Pick the frameworks you want:
4 | require "active_model/railtie"
5 | require "active_record/railtie"
6 | require "action_controller/railtie"
7 | require "action_mailer/railtie"
8 | require "action_view/railtie"
9 | require "sprockets/railtie"
10 | # require "rails/test_unit/railtie"
11 |
12 | # Require the gems listed in Gemfile, including any gems
13 | # you've limited to :test, :development, or :production.
14 | Bundler.require(*Rails.groups)
15 |
16 | module AsyncUploader
17 | class Application < Rails::Application
18 | # Settings in config/environments/* take precedence over those specified here.
19 | # Application configuration should go into files in config/initializers
20 | # -- all .rb files in that directory are automatically loaded.
21 |
22 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
23 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
24 | # config.time_zone = 'Central Time (US & Canada)'
25 |
26 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
27 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
28 | # config.i18n.default_locale = :de
29 | end
30 | end
31 |
--------------------------------------------------------------------------------
/config/boot.rb:
--------------------------------------------------------------------------------
1 | # Set up gems listed in the Gemfile.
2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3 |
4 | require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5 |
--------------------------------------------------------------------------------
/config/database.yml:
--------------------------------------------------------------------------------
1 | # SQLite version 3.x
2 | # gem install sqlite3
3 | #
4 | # Ensure the SQLite 3 gem is defined in your Gemfile
5 | # gem 'sqlite3'
6 | #
7 | default: &default
8 | adapter: sqlite3
9 | pool: 5
10 | timeout: 5000
11 |
12 | development:
13 | <<: *default
14 | database: db/development.sqlite3
15 |
16 | # Warning: The database defined as "test" will be erased and
17 | # re-generated from your development database when you run "rake".
18 | # Do not set this db to the same as development or production.
19 | test:
20 | <<: *default
21 | database: db/test.sqlite3
22 |
23 | production:
24 | <<: *default
25 | database: db/production.sqlite3
26 |
--------------------------------------------------------------------------------
/config/environment.rb:
--------------------------------------------------------------------------------
1 | # Load the Rails application.
2 | require File.expand_path('../application', __FILE__)
3 |
4 | # Initialize the Rails application.
5 | Rails.application.initialize!
6 |
--------------------------------------------------------------------------------
/config/environments/development.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # In the development environment your application's code is reloaded on
5 | # every request. This slows down response time but is perfect for development
6 | # since you don't have to restart the web server when you make code changes.
7 | config.cache_classes = false
8 |
9 | # Do not eager load code on boot.
10 | config.eager_load = false
11 |
12 | # Show full error reports and disable caching.
13 | config.consider_all_requests_local = true
14 | config.action_controller.perform_caching = false
15 |
16 | # Don't care if the mailer can't send.
17 | config.action_mailer.raise_delivery_errors = false
18 |
19 | # Print deprecation notices to the Rails logger.
20 | config.active_support.deprecation = :log
21 |
22 | # Raise an error on page load if there are pending migrations.
23 | config.active_record.migration_error = :page_load
24 |
25 | # Debug mode disables concatenation and preprocessing of assets.
26 | # This option may cause significant delays in view rendering with a large
27 | # number of complex assets.
28 | config.assets.debug = true
29 |
30 | # Adds additional error checking when serving assets at runtime.
31 | # Checks for improperly declared sprockets dependencies.
32 | # Raises helpful error messages.
33 | config.assets.raise_runtime_errors = true
34 |
35 | # Raises error for missing translations
36 | # config.action_view.raise_on_missing_translations = true
37 | end
38 |
--------------------------------------------------------------------------------
/config/environments/production.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # Code is not reloaded between requests.
5 | config.cache_classes = true
6 |
7 | # Eager load code on boot. This eager loads most of Rails and
8 | # your application in memory, allowing both threaded web servers
9 | # and those relying on copy on write to perform better.
10 | # Rake tasks automatically ignore this option for performance.
11 | config.eager_load = true
12 |
13 | # Full error reports are disabled and caching is turned on.
14 | config.consider_all_requests_local = false
15 | config.action_controller.perform_caching = true
16 |
17 | # Enable Rack::Cache to put a simple HTTP cache in front of your application
18 | # Add `rack-cache` to your Gemfile before enabling this.
19 | # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
20 | config.action_dispatch.rack_cache = true
21 |
22 | # Disable Rails's static asset server (Apache or nginx will already do this).
23 | config.serve_static_assets = false
24 |
25 | # Compress JavaScripts and CSS.
26 | config.assets.js_compressor = :uglifier
27 | # config.assets.css_compressor = :sass
28 |
29 | # Do not fallback to assets pipeline if a precompiled asset is missed.
30 | config.assets.compile = false
31 |
32 | # Generate digests for assets URLs.
33 | config.assets.digest = true
34 |
35 | # Version of your assets, change this if you want to expire all your assets.
36 | config.assets.version = '1.0'
37 |
38 | # Specifies the header that your server uses for sending files.
39 | # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
40 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
41 |
42 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
43 | # config.force_ssl = true
44 |
45 | # Set to :debug to see everything in the log.
46 | config.log_level = :info
47 |
48 | # Prepend all log lines with the following tags.
49 | # config.log_tags = [ :subdomain, :uuid ]
50 |
51 | # Use a different logger for distributed setups.
52 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
53 |
54 | # Use a different cache store in production.
55 | # config.cache_store = :mem_cache_store
56 |
57 | # Enable serving of images, stylesheets, and JavaScripts from an asset server.
58 | # config.action_controller.asset_host = "http://assets.example.com"
59 |
60 | # Precompile additional assets.
61 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
62 | # config.assets.precompile += %w( search.js )
63 |
64 | # Ignore bad email addresses and do not raise email delivery errors.
65 | # Set this to true and configure the email server for immediate delivery to raise delivery errors.
66 | # config.action_mailer.raise_delivery_errors = false
67 |
68 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
69 | # the I18n.default_locale when a translation cannot be found).
70 | config.i18n.fallbacks = true
71 |
72 | # Send deprecation notices to registered listeners.
73 | config.active_support.deprecation = :notify
74 |
75 | # Disable automatic flushing of the log to improve performance.
76 | # config.autoflush_log = false
77 |
78 | # Use default logging formatter so that PID and timestamp are not suppressed.
79 | config.log_formatter = ::Logger::Formatter.new
80 |
81 | # Do not dump schema after migrations.
82 | config.active_record.dump_schema_after_migration = false
83 | end
84 |
--------------------------------------------------------------------------------
/config/environments/test.rb:
--------------------------------------------------------------------------------
1 | Rails.application.configure do
2 | # Settings specified here will take precedence over those in config/application.rb.
3 |
4 | # The test environment is used exclusively to run your application's
5 | # test suite. You never need to work with it otherwise. Remember that
6 | # your test database is "scratch space" for the test suite and is wiped
7 | # and recreated between test runs. Don't rely on the data there!
8 | config.cache_classes = true
9 |
10 | # Do not eager load code on boot. This avoids loading your whole application
11 | # just for the purpose of running a single test. If you are using a tool that
12 | # preloads Rails for running tests, you may have to set it to true.
13 | config.eager_load = false
14 |
15 | # Configure static asset server for tests with Cache-Control for performance.
16 | config.serve_static_assets = true
17 | config.static_cache_control = 'public, max-age=3600'
18 |
19 | # Show full error reports and disable caching.
20 | config.consider_all_requests_local = true
21 | config.action_controller.perform_caching = false
22 |
23 | # Raise exceptions instead of rendering exception templates.
24 | config.action_dispatch.show_exceptions = false
25 |
26 | # Disable request forgery protection in test environment.
27 | config.action_controller.allow_forgery_protection = false
28 |
29 | # Tell Action Mailer not to deliver emails to the real world.
30 | # The :test delivery method accumulates sent emails in the
31 | # ActionMailer::Base.deliveries array.
32 | config.action_mailer.delivery_method = :test
33 |
34 | # Print deprecation notices to the stderr.
35 | config.active_support.deprecation = :stderr
36 |
37 | # Raises error for missing translations
38 | # config.action_view.raise_on_missing_translations = true
39 | end
40 |
--------------------------------------------------------------------------------
/config/initializers/backtrace_silencers.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5 |
6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7 | # Rails.backtrace_cleaner.remove_silencers!
8 |
--------------------------------------------------------------------------------
/config/initializers/cookies_serializer.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | Rails.application.config.action_dispatch.cookies_serializer = :json
--------------------------------------------------------------------------------
/config/initializers/dragonfly.rb:
--------------------------------------------------------------------------------
1 | require 'dragonfly'
2 |
3 | # Configure
4 | Dragonfly.app.configure do
5 | plugin :imagemagick
6 |
7 | protect_from_dos_attacks true
8 | secret Rails.application.secrets.secret_key_base
9 |
10 | url_format "/media/:job/:name"
11 |
12 | if Rails.env.development? || Rails.env.test?
13 | datastore :file,
14 | root_path: Rails.root.join('public/system/dragonfly', Rails.env),
15 | server_root: Rails.root.join('public')
16 | else
17 | datastore :s3,
18 | bucket_name: 'bodrov_sitepoint',
19 | access_key_id: Rails.application.secrets.aws_access_key_id,
20 | secret_access_key: Rails.application.secrets.aws_secret_key,
21 | url_scheme: 'https'
22 | end
23 | end
24 |
25 | # Logger
26 | Dragonfly.logger = Rails.logger
27 |
28 | # Mount as middleware
29 | Rails.application.middleware.use Dragonfly::Middleware
30 |
31 | # Add model functionality
32 | if defined?(ActiveRecord::Base)
33 | ActiveRecord::Base.extend Dragonfly::Model
34 | ActiveRecord::Base.extend Dragonfly::Model::Validations
35 | end
36 |
--------------------------------------------------------------------------------
/config/initializers/filter_parameter_logging.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Configure sensitive parameters which will be filtered from the log file.
4 | Rails.application.config.filter_parameters += [:password]
5 |
--------------------------------------------------------------------------------
/config/initializers/inflections.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new inflection rules using the following format. Inflections
4 | # are locale specific, and you may define rules for as many different
5 | # locales as you wish. All of these examples are active by default:
6 | # ActiveSupport::Inflector.inflections(:en) do |inflect|
7 | # inflect.plural /^(ox)$/i, '\1en'
8 | # inflect.singular /^(ox)en/i, '\1'
9 | # inflect.irregular 'person', 'people'
10 | # inflect.uncountable %w( fish sheep )
11 | # end
12 |
13 | # These inflection rules are supported but not enabled by default:
14 | # ActiveSupport::Inflector.inflections(:en) do |inflect|
15 | # inflect.acronym 'RESTful'
16 | # end
17 |
--------------------------------------------------------------------------------
/config/initializers/mime_types.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Add new mime types for use in respond_to blocks:
4 | # Mime::Type.register "text/richtext", :rtf
5 |
--------------------------------------------------------------------------------
/config/initializers/session_store.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | Rails.application.config.session_store :cookie_store, key: '_async_uploader_session'
4 |
--------------------------------------------------------------------------------
/config/initializers/wrap_parameters.rb:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # This file contains settings for ActionController::ParamsWrapper which
4 | # is enabled by default.
5 |
6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7 | ActiveSupport.on_load(:action_controller) do
8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
9 | end
10 |
11 | # To enable root element in JSON for ActiveRecord objects.
12 | # ActiveSupport.on_load(:active_record) do
13 | # self.include_root_in_json = true
14 | # end
15 |
--------------------------------------------------------------------------------
/config/locales/en.yml:
--------------------------------------------------------------------------------
1 | # Files in the config/locales directory are used for internationalization
2 | # and are automatically loaded by Rails. If you want to use locales other
3 | # than English, add the necessary files in this directory.
4 | #
5 | # To use the locales, use `I18n.t`:
6 | #
7 | # I18n.t 'hello'
8 | #
9 | # In views, this is aliased to just `t`:
10 | #
11 | # <%= t('hello') %>
12 | #
13 | # To use a different locale, set it with `I18n.locale`:
14 | #
15 | # I18n.locale = :es
16 | #
17 | # This would use the information in config/locales/es.yml.
18 | #
19 | # To learn more, please read the Rails Internationalization guide
20 | # available at http://guides.rubyonrails.org/i18n.html.
21 |
22 | en:
23 | hello: "Hello world"
24 |
--------------------------------------------------------------------------------
/config/routes.rb:
--------------------------------------------------------------------------------
1 | Rails.application.routes.draw do
2 | resources :photos, only: [:new, :create]
3 | get '/photos/new_multiple', to: 'photos#new_multiple', as: :new_photo_multiple
4 | root to: 'photos#new'
5 | end
6 |
--------------------------------------------------------------------------------
/config/secrets.yml:
--------------------------------------------------------------------------------
1 | # Be sure to restart your server when you modify this file.
2 |
3 | # Your secret key is used for verifying the integrity of signed cookies.
4 | # If you change this key, all old signed cookies will become invalid!
5 |
6 | # Make sure the secret is at least 30 characters and all random,
7 | # no regular words or you'll be exposed to dictionary attacks.
8 | # You can use `rake secret` to generate a secure secret key.
9 |
10 | # Make sure the secrets in this file are kept private
11 | # if you're sharing your code publicly.
12 |
13 | development:
14 | secret_key_base: a7873afab344fa62e44db82b0e392708e79efe66a3a72f14b4523c42febc539820ae116374fa1f7542c7baaa662cd3944579a9bb763695392e824e787d7bcbd2
15 | test:
16 | secret_key_base: 68975bf7f8a076e71feff64489c13d4c836581c489fcb56c204765958dbeadb5f04fdc01e712eebacfc94684b7dcf4db4afcc6e17b48db6f656b71bb8de79b7b
17 |
18 | # Do not keep production secrets in the repository,
19 | # instead read values from the environment.
20 | production:
21 | secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
22 | aws_access_key_id: <%= ENV['AWS_KEY'] %>
23 | aws_secret_key: <%= ENV['AWS_SECRET'] %>
--------------------------------------------------------------------------------
/db/migrate/20140618095323_create_photos.rb:
--------------------------------------------------------------------------------
1 | class CreatePhotos < ActiveRecord::Migration
2 | def change
3 | create_table :photos do |t|
4 | t.string :image_uid
5 | t.string :title
6 |
7 | t.timestamps
8 | end
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/db/migrate/20140618110804_add_author_and_image_name_to_photos.rb:
--------------------------------------------------------------------------------
1 | class AddAuthorAndImageNameToPhotos < ActiveRecord::Migration
2 | def change
3 | add_column :photos, :author, :string
4 | add_column :photos, :image_name, :string
5 | remove_column :photos, :title, :string
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/db/schema.rb:
--------------------------------------------------------------------------------
1 | # encoding: UTF-8
2 | # This file is auto-generated from the current state of the database. Instead
3 | # of editing this file, please use the migrations feature of Active Record to
4 | # incrementally modify your database, and then regenerate this schema definition.
5 | #
6 | # Note that this schema.rb definition is the authoritative source for your
7 | # database schema. If you need to create the application database on another
8 | # system, you should be using db:schema:load, not running all the migrations
9 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10 | # you'll amass, the slower it'll run and the greater likelihood for issues).
11 | #
12 | # It's strongly recommended that you check this file into your version control system.
13 |
14 | ActiveRecord::Schema.define(version: 20140618110804) do
15 |
16 | create_table "photos", force: true do |t|
17 | t.string "image_uid"
18 | t.datetime "created_at"
19 | t.datetime "updated_at"
20 | t.string "author"
21 | t.string "image_name"
22 | end
23 |
24 | end
25 |
--------------------------------------------------------------------------------
/db/seeds.rb:
--------------------------------------------------------------------------------
1 | # This file should contain all the record creation needed to seed the database with its default values.
2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3 | #
4 | # Examples:
5 | #
6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7 | # Mayor.create(name: 'Emanuel', city: cities.first)
8 |
--------------------------------------------------------------------------------
/lib/assets/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/lib/assets/.keep
--------------------------------------------------------------------------------
/lib/tasks/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/lib/tasks/.keep
--------------------------------------------------------------------------------
/log/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/log/.keep
--------------------------------------------------------------------------------
/public/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The page you were looking for doesn't exist (404)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
The page you were looking for doesn't exist.
62 |
You may have mistyped the address or the page may have moved.
63 |
64 |
If you are the application owner check the logs for more information.
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/public/422.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | The change you wanted was rejected (422)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
The change you wanted was rejected.
62 |
Maybe you tried to change something you didn't have access to.
63 |
64 |
If you are the application owner check the logs for more information.
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/public/500.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | We're sorry, but something went wrong (500)
5 |
6 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
We're sorry, but something went wrong.
62 |
63 |
If you are the application owner check the logs for more information.
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/public/favicon.ico
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
2 | #
3 | # To ban all spiders from the entire site uncomment the next two lines:
4 | # User-agent: *
5 | # Disallow: /
6 |
--------------------------------------------------------------------------------
/vendor/assets/javascripts/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/vendor/assets/javascripts/.keep
--------------------------------------------------------------------------------
/vendor/assets/stylesheets/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bodrovis/sitepoint-async-upload/c2c29f5815ad5ae76aad9f61ced375d81a8ab8c4/vendor/assets/stylesheets/.keep
--------------------------------------------------------------------------------