Yandex.Disk storage plugin for CarrierWave
This gem allows you to set Yandex.Disk (free of charge) as an online storage for the files you upload to your site with CarrierWave. It is analogous to the fog gems family and is especially useful for using CarrierWave on Heroku (where the common file storage is not supported).
This gem is NOT intended for an industry-scale cloud files storage (due to the possible Yandex.Disk bandwidth and other limitations). But it's a right fit for your (Heroku-based) job application test work, educational projects, etc.
Installation
Set up a Yandex.Disk free account as described on the Yandex::Disk gem page.
Add this line to your application's Gemfile:
gem 'carrierwave-yandex-disk', '~> 0.1.0'Set up your Rails application:
- Write your OAuth2 token (generated on the Yandex.Disk setup step) into the
config/secrets.ymlfile like this:
development:
yandex_disk_access_token: 'AQAAAAAND3AxAATUPz31jhEFF0P_gltPlOFGi-4'
test:
yandex_disk_access_token: 'AQAAAAAND3AxAATUPz31jhEFF0P_gltPlOFGi-4'
production:
yandex_disk_access_token: <%= ENV["YANDEX_DISK_ACCESS_TOKEN"] %>See more info about secrets.yml usage.
-
Add your
config/secrets.ymlto the.gitignorefile (if you haven't done it previously). -
Create a file
config/initializers/carrierwave.rbwith the following content:
CarrierWave.configure do |config|
config.yandex_disk_access_token = Rails.application.secrets.yandex_disk_access_token
endNOTE: You may use whatever other token initialization source here (if you don't like secrets.yml).
In the target uploader set the storage like this:
# app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
#storage :file
storage :yandex_disk
endSet up the Carrierwave gem.
Usage
The usage is basically the same as in the regular (file-storage) CarrierWave case. The uploaded files get immediately "published" (e.g. available to anyone) on Yandex.Disk.
NOTE: Do not manually operate with the CarrierWave-uploaded files on your Yandex.Disk account!
Imagine you defined a model with an uploader:
class User < ApplicationRecord
mount_uploader :avatar, AvatarUploader
endThen (in your views) you can access the following methods:
url:
@user.avatar.urlor
@user.avatar.file.urlReturn example:
https://downloader.disk.yandex.ru/disk/25e9fa3c40ea7e440029923e4a4c63e2f01cb66be3cda8cd1a756b8d2f46000f/5a934e46/jP34-9cszbD04Qaxa28_KP9GIgRMt42Dc_8aZRK8u2QXMsbsCPO6xe254apPTxbNg5jWPBB01aCTbWcWJo_f4g%3D%3D?uid=0&filename=user.png&disposition=attachment&hash=aHZ5UF177vQMTgCaLYPLS/VKtUrFKs/wlXlPu%2B7jXUw%3D%3A&limit=0&content_type=image%2Fpng&fsize=21128&hid=662f9a494d1d41839c86afd9c1de6afc&media_type=image&tknv=v2Yields the direct URL (for your uploaded file) which is dynamically fetched from the server on every view rendering. This is a Yandex.Disk direct link policy limitation.
public_url:
@user.avatar.file.public_urlReturn example:
https://yadi.sk/i/H_D62-Ln3SmAhcYields the public URL (for your uploaded file). You may use this value for distributing the uploaded file beyond your site (on forums, blogs, etc).
storage_path:
@user.avatar.file.storage_pathReturn example:
/uploads/user/avatar/1/user.pngYields the internal storage path (for your uploaded file). You would hardly need this value. It's format depends on the uploader's store_dir function.
filename:
@user.avatar.file.filenameReturn example:
user.pngYields the filename (for your uploaded file).
extension:
@user.avatar.file.extensionReturn example:
.pngYields the extension (for your uploaded file).
Special thanks
This project is highly based on the carrierwave-dropbox gem.
Thanks to its author and contributors!
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/programrails/carrierwave-yandex-disk.
License
The gem is available as open source under the terms of the MIT License.