Написать адаптер для Microsoft Azure в Sitemap_generator
Я использую sitemap_generator для создания файлов Sitemap в моем проекте RoR. До сих пор все работает нормально. Я размещаю свой проект на Heroku, который не позволяет выполнять запись в локальную файловую систему. Мне все еще требуется некоторый доступ для записи, поскольку файлы карты сайта нуждаются в быть записанным перед загрузкой. Но я должен использовать Microsoft Azure для хранения своей карты сайта. Адаптеры, перечисленные в sitemap_generator, не включают Azure. Может кто-нибудь указать мне правильное направление для написания адаптера для Azure.
Ссылаясь на "Настроить carrierwave" в этой статье, я сделал несколько изменений в своем коде.
Но я не уверен, что поможет только редактирование файла initialiazer. В приведенной выше статье Carrierwave указывает на WaveAdapter, который использует CarrierWave::Uploader::Base для загрузки в любой сервис, поддерживаемый CarrierWave.
конфиг / Инициализаторы /azure.rb
Azure.configure do |config|
config.cache_dir = "#{Rails.root}/tmp/"
config.storage = :microsoft_azure
config.permissions = 0666
config.microsoft_azure_credentials = {
:provider => 'azure',
:storage_account_name => 'your account name',
:storage_access_key => 'your key',
}
config.azure_directory = 'container name'
end
Пожалуйста помоги!
1 ответ
Я скопировал настройки из адаптера S3 и из рубинового примера Azure.
Добавьте камень лазурной капли в свой Gemfile:gem 'azure-storage-blob'
создать config / initializers / sitemap_generator / azure_adapter.rb:
require 'azure/storage/blob'
module SitemapGenerator
# Class for uploading sitemaps to Azure blobs using azure-storage-blob gem.
class AzureAdapter
#
# @option :storage_account_name [String] Your Azure access key id
# @option :storage_access_key [String] Your Azure secret access key
# @option :container [String]
def initialize
@storage_account_name = 'your account name'
@storage_access_key = 'your key'
@container = 'your container name (created already in Azure)'
end
# Call with a SitemapLocation and string data
def write(location, raw_data)
SitemapGenerator::FileAdapter.new.write(location, raw_data)
credentials = {
storage_account_name: @storage_account_name,
storage_access_key: @storage_access_key
}
client = Azure::Storage::Blob::BlobService.create(credentials)
container = @container
content = ::File.open(location.path, 'rb') { |file| file.read }
client.create_block_blob(container, location.filename, content)
end
end
end
- Убедитесь, что контейнер, который вы создаете в Azure, является контейнером "больших двоичных объектов", чтобы этот контейнер не был общедоступным, а находящиеся внутри него большие двоичные объекты.
а затем в config / sitemaps.rb:
SitemapGenerator::Sitemap.sitemaps_host = 'https://[your-azure-address].blob.core.windows.net/'
SitemapGenerator::Sitemap.sitemaps_path = '[your-container-name]/'
SitemapGenerator::Sitemap.adapter = SitemapGenerator::AzureAdapter.new
Это должно сделать это!