Написать адаптер для Microsoft Azure в Sitemap_generator - PullRequest
0 голосов
/ 29 января 2019

Я использую sitemap_generator для создания файлов сайтов в моем проекте RoR. До сих пор все работает нормально. Я размещаю свой проект на Heroku, который не позволяет выполнять запись в локальную файловую систему. Мне по-прежнему требуетсянекоторые имеют право на запись, потому что файлы карты сайта должны быть записаны перед загрузкой.Но я должен использовать Microsoft Azure для хранения моей карты сайта. Адаптеры, перечисленные в sitemap_generator, не включают в себя Azure. Может ли кто-нибудь указать мне правильное направление для написания адаптера для Azure. эта статья Я сделал несколько изменений в своем коде.

Но я не уверен, что поможет только редактирование файла initialiazer. В вышеприведенной статье Carrierwave указывает на WaveAdapter здесь , который использует CarrierWave :: Uploader :: Base для загрузки в любой сервис, поддерживаемый CarrierWave

config / initializers / 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 Ответ

0 голосов
/ 02 февраля 2019

Я скопировал настройки из адаптера S3 и из Пример Ruby Azure

Добавьте драгоценный камень Azure BLOB в ваш Gemfile: gem 'azure-storage-blob'

create 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, является контейнером «BLOB-объектов», поэтому этот контейнер не является общедоступным, но внутри него находятся большие двоичные объекты..

, а затем в 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

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

...