Написать адаптер для 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

Это должно сделать это!

Другие вопросы по тегам