Class: ActiveStorage::Service::AzureStorageService

Inherits:
ActiveStorage::Service show all
Defined in:
activestorage/lib/active_storage/service/azure_storage_service.rb

Overview

Wraps the Microsoft Azure Storage Blob Service as an Active Storage service. See ActiveStorage::Service for the generic API documentation that applies to all services.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ActiveStorage::Service

build, configure

Methods included from ActiveSupport::Autoload

#autoload, #autoload_at, #autoload_under, #autoloads, #eager_autoload, #eager_load!, extended

Constructor Details

#initialize(path:, storage_account_name:, storage_access_key:, container:) ⇒ AzureStorageService

Returns a new instance of AzureStorageService.



13
14
15
16
17
18
19
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 13

def initialize(path:, storage_account_name:, storage_access_key:, container:)
  @client = Azure::Storage::Client.create(storage_account_name: , storage_access_key: storage_access_key)
  @signer = Azure::Storage::Core::Auth::SharedAccessSignature.new(, storage_access_key)
  @blobs = client.blob_client
  @container = container
  @path = path
end

Instance Attribute Details

#blobsObject (readonly)

Returns the value of attribute blobs.



11
12
13
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 11

def blobs
  @blobs
end

#clientObject (readonly)

Returns the value of attribute client.



11
12
13
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 11

def client
  @client
end

#containerObject (readonly)

Returns the value of attribute container.



11
12
13
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 11

def container
  @container
end

#pathObject (readonly)

Returns the value of attribute path.



11
12
13
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 11

def path
  @path
end

#signerObject (readonly)

Returns the value of attribute signer.



11
12
13
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 11

def signer
  @signer
end

Instance Method Details

#delete(key) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 44

def delete(key)
  instrument :delete, key do
    begin
      blobs.delete_blob(container, key)
    rescue Azure::Core::Http::HTTPError
      false
    end
  end
end

#download(key) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 31

def download(key)
  if block_given?
    instrument :streaming_download, key do
      stream(key, &block)
    end
  else
    instrument :download, key do
      _, io = blobs.get_blob(container, key)
      io.force_encoding(Encoding::BINARY)
    end
  end
end

#exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
58
59
60
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 54

def exist?(key)
  instrument :exist, key do |payload|
    answer = blob_for(key).present?
    payload[:exist] = answer
    answer
  end
end

#headers_for_direct_upload(key, content_type:, checksum:) ⇒ Object



91
92
93
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 91

def headers_for_direct_upload(key, content_type:, checksum:, **)
  { "Content-Type" => content_type, "Content-MD5" => checksum, "x-ms-blob-type" => "BlockBlob" }
end

#upload(key, io, checksum: nil) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 21

def upload(key, io, checksum: nil)
  instrument :upload, key, checksum: checksum do
    begin
      blobs.create_block_blob(container, key, io, content_md5: checksum)
    rescue Azure::Core::Http::HTTPError
      raise ActiveStorage::IntegrityError
    end
  end
end

#url(key, expires_in:, filename:, disposition:, content_type:) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 62

def url(key, expires_in:, filename:, disposition:, content_type:)
  instrument :url, key do |payload|
    base_url = url_for(key)
    generated_url = signer.signed_uri(
      URI(base_url), false,
      permissions: "r",
      expiry: format_expiry(expires_in),
      content_disposition: disposition,
      content_type: content_type
    ).to_s

    payload[:url] = generated_url

    generated_url
  end
end

#url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
# File 'activestorage/lib/active_storage/service/azure_storage_service.rb', line 79

def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
  instrument :url, key do |payload|
    base_url = url_for(key)
    generated_url = signer.signed_uri(URI(base_url), false, permissions: "rw",
      expiry: format_expiry(expires_in)).to_s

    payload[:url] = generated_url

    generated_url
  end
end