Pythonを用いてConoHaオブジェクトストレージにアップロードする処理の検証

Pythonを用いてConoHaオブジェクトストレージにアップロードする処理の検証結果をご紹介します。

オブジェクトストレージの操作に関しては以下の記事をご参照ください。

PythonでConoHaのオブジェクトストレージ操作を行う方法

PythonでConoHaのオブジェクトストレージ操作を行う方法2

条件

  • ConoHaオブジェクトストレージ
  • Ubuntu 18.04 LTS
  • Python 3.6.8

前提

「sample2」というコンテナが存在し、web公開設定がなされているものとします。

使用したソース

以下のようなソースを用いて、オブジェクトのアップロードを行いました。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# uploadTest.py
import requests
import json
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler
from os import path
## ログ出力設定
logger = getLogger("オブジェクトストレージ操作")
logger.setLevel(DEBUG)
# コンソール出力設定
stream_handler = StreamHandler()
formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
# 接続パラメータ
USER_NAME = "gncu00000000"
PASSWORD = "passpasspass"
TENANT_ID = "9999999999999999999999999"
URL = 'https://identity.tyo2.conoha.io/v2.0/tokens'
OBJECT_STORAGE = 'https://object-storage.tyo2.conoha.io/v1/nc_9999999999999999999999999999'
# オブジェクトストレージ情報
CONTAINER1 = 'sample1'
CONTAINER2 = 'sample2'
UPLOAD_SRC = '/home/images/1.jpg'
UPLOAD_DIST = '1.jpg'
def getToken():
"""
tokenの取得
"""
headers = {
'Accept': 'application/json',
}
data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID)
#logger.debug(data)
response = requests.post(URL, headers=headers, data=data)
data = response.json()
return json.dumps(data["access"]["token"]["id"], indent=4)
def uploadObject(token):
"""
オブジェクトのアップロード
"""
headers = {
'Accept': 'application/json',
'X-Auth-Token': token,
}
with open(UPLOAD_SRC, 'rb') as image:
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_DIST, headers=headers, data=image)
return response
def main():
"""
実処理(main)
"""
token = getToken().replace('\"', '') # tokenの取得
result = uploadObject(token) # オブジェクトのアップロード
logger.debug('オブジェクトのアップロード:' + str(result))
if __name__ == '__main__':
"""
main関数を実行
"""
main()
# uploadTest.py import requests import json from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler from os import path ## ログ出力設定 logger = getLogger("オブジェクトストレージ操作") logger.setLevel(DEBUG) # コンソール出力設定 stream_handler = StreamHandler() formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # 接続パラメータ USER_NAME = "gncu00000000" PASSWORD = "passpasspass" TENANT_ID = "9999999999999999999999999" URL = 'https://identity.tyo2.conoha.io/v2.0/tokens' OBJECT_STORAGE = 'https://object-storage.tyo2.conoha.io/v1/nc_9999999999999999999999999999' # オブジェクトストレージ情報 CONTAINER1 = 'sample1' CONTAINER2 = 'sample2' UPLOAD_SRC = '/home/images/1.jpg' UPLOAD_DIST = '1.jpg' def getToken(): """ tokenの取得 """ headers = { 'Accept': 'application/json', } data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID) #logger.debug(data) response = requests.post(URL, headers=headers, data=data) data = response.json() return json.dumps(data["access"]["token"]["id"], indent=4) def uploadObject(token): """ オブジェクトのアップロード """ headers = { 'Accept': 'application/json', 'X-Auth-Token': token, } with open(UPLOAD_SRC, 'rb') as image: response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_DIST, headers=headers, data=image) return response def main(): """ 実処理(main) """ token = getToken().replace('\"', '') # tokenの取得 result = uploadObject(token) # オブジェクトのアップロード logger.debug('オブジェクトのアップロード:' + str(result)) if __name__ == '__main__': """ main関数を実行 """ main()
# uploadTest.py

import requests
import json
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler
from os import path

## ログ出力設定
logger = getLogger("オブジェクトストレージ操作")
logger.setLevel(DEBUG)

# コンソール出力設定
stream_handler = StreamHandler()
formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

# 接続パラメータ
USER_NAME = "gncu00000000"
PASSWORD = "passpasspass"
TENANT_ID = "9999999999999999999999999"
URL = 'https://identity.tyo2.conoha.io/v2.0/tokens'
OBJECT_STORAGE = 'https://object-storage.tyo2.conoha.io/v1/nc_9999999999999999999999999999'

# オブジェクトストレージ情報
CONTAINER1 = 'sample1'
CONTAINER2 = 'sample2'
UPLOAD_SRC = '/home/images/1.jpg'
UPLOAD_DIST = '1.jpg'


def getToken():
    """
    tokenの取得
    """
    
    headers = {
        'Accept': 'application/json',
    }

    data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID)
    #logger.debug(data)

    response = requests.post(URL, headers=headers, data=data)
    data = response.json()

    return json.dumps(data["access"]["token"]["id"], indent=4)


def uploadObject(token):
    """
    オブジェクトのアップロード
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    with open(UPLOAD_SRC, 'rb') as image:
        response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_DIST, headers=headers, data=image)

    return response


def main():
    """
    実処理(main)
    """
    
    token = getToken().replace('\"', '')  # tokenの取得

    result = uploadObject(token)  # オブジェクトのアップロード
    logger.debug('オブジェクトのアップロード:' + str(result))


if __name__ == '__main__':
    """
    main関数を実行
    """
    
    main()

検証結果

アップロード先の指定を色々と変えて、どのような結果になるか検証しました。

ファイル名のみ

アップロードファイル指定

アップロードファイルを以下のように指定します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
UPLOAD_DIST = '1.jpg'
UPLOAD_DIST = '1.jpg'
UPLOAD_DIST = '1.jpg'

実行

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ python3 uploadTest.py
2019-09-04 13:16:08,887 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$
$ python3 uploadTest.py 2019-09-04 13:16:08,887 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]> $
$ python3 uploadTest.py
2019-09-04 13:16:08,887 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$

実行結果

「sample2」の直下にアップロードされます。

以下のようなURLで参照することが出来ます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/1.jpg

フォルダ名+ファイル名

アップロードファイル指定

アップロードファイルを以下のように指定します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
UPLOAD_DIST = 'test/1.jpg'
UPLOAD_DIST = 'test/1.jpg'
UPLOAD_DIST = 'test/1.jpg'

実行

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ python3 uploadTest.py
2019-09-04 13:25:38,069 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$
$ python3 uploadTest.py 2019-09-04 13:25:38,069 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]> $
$ python3 uploadTest.py
2019-09-04 13:25:38,069 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$

実行結果

「sample2」の下に「test」というフォルダが作成されて、その中にアップロードされます。

以下のようなURLで参照することが出来ます。
(testという階層が追加になりました。)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test/1.jpg

2回目の実行

以下のようなパスを指定して再度実行します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
UPLOAD_DIST = 'test/2.jpg'
UPLOAD_DIST = 'test/2.jpg'
UPLOAD_DIST = 'test/2.jpg'

「sample2」の下に「test」というフォルダが作成済みなので、「test」フォルダの下にファイルが追加されます。

多段階層

アップロードファイル指定

アップロードファイルを以下のように指定します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
UPLOAD_DIST = 'test1/test2/test3/1.jpg'
UPLOAD_DIST = 'test1/test2/test3/1.jpg'
UPLOAD_DIST = 'test1/test2/test3/1.jpg'

実行

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ python3 uploadTest.py
2019-09-04 13:34:33,366 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$
$ python3 uploadTest.py 2019-09-04 13:34:33,366 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]> $
$ python3 uploadTest.py
2019-09-04 13:34:33,366 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
$

実行結果

「sample2」の下に、指定した通りにフォルダ階層が作成されて、その中にアップロードされます。

以下のようなURLで参照することが出来ます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test1/test2/test3/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test1/test2/test3/1.jpg
https://object-storage.tyo2.conoha.io/v1/nc_XXXXXXXXXXXXXXXXXXXXXXXXX/sample2/test1/test2/test3/1.jpg

フォルダ階層指定

以下のようなパスを指定して再度実行します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
UPLOAD_DIST = 'test1/test2/1.jpg'
UPLOAD_DIST = 'test1/test2/1.jpg'
UPLOAD_DIST = 'test1/test2/1.jpg'

指定した階層(test1/test2/)にファイルがアップロードされます。

まとめ

ConoHaオブジェクトストレージでは、フォルダ階層を指定したオブジェクトのアップロード/参照が可能です。

作成できるコンテナ数には上限(1ConoHaアカウントにつき最大100コンテナ)がありますが、フォルダ階層をうまく活用することで、ストレージ上でのオブジェクトのカテゴリ分けが出来そうです。

参考

ConoHa:オブジェクトストレージ

https://www.conoha.jp/objectstorage/



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です