Pythonを用いてConoHaオブジェクトストレージにアップロードする処理の検証結果をご紹介します。
オブジェクトストレージの操作に関しては以下の記事をご参照ください。
PythonでConoHaのオブジェクトストレージ操作を行う方法
PythonでConoHaのオブジェクトストレージ操作を行う方法2
条件
- ConoHaオブジェクトストレージ
- Ubuntu 18.04 LTS
- Python 3.6.8
前提
「sample2」というコンテナが存在し、web公開設定がなされているものとします。

使用したソース
以下のようなソースを用いて、オブジェクトのアップロードを行いました。
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler
logger = getLogger("オブジェクトストレージ操作")
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'
UPLOAD_SRC = '/home/images/1.jpg'
'Accept': 'application/json',
data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID)
response = requests.post(URL, headers=headers, data=data)
return json.dumps(data["access"]["token"]["id"], indent=4)
'Accept': 'application/json',
with open(UPLOAD_SRC, 'rb') as image:
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_DIST, headers=headers, data=image)
token = getToken().replace('\"', '') # tokenの取得
result = uploadObject(token) # オブジェクトのアップロード
logger.debug('オブジェクトのアップロード:' + str(result))
if __name__ == '__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()
検証結果
アップロード先の指定を色々と変えて、どのような結果になるか検証しました。
ファイル名のみ
アップロードファイル指定
アップロードファイルを以下のように指定します。
UPLOAD_DIST = '1.jpg'
実行
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で参照することが出来ます。
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

フォルダ名+ファイル名
アップロードファイル指定
アップロードファイルを以下のように指定します。
UPLOAD_DIST = 'test/1.jpg'
UPLOAD_DIST = 'test/1.jpg'
UPLOAD_DIST = 'test/1.jpg'
実行
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という階層が追加になりました。)
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回目の実行
以下のようなパスを指定して再度実行します。
UPLOAD_DIST = 'test/2.jpg'
UPLOAD_DIST = 'test/2.jpg'
UPLOAD_DIST = 'test/2.jpg'
「sample2」の下に「test」というフォルダが作成済みなので、「test」フォルダの下にファイルが追加されます。

多段階層
アップロードファイル指定
アップロードファイルを以下のように指定します。
UPLOAD_DIST = 'test1/test2/test3/1.jpg'
UPLOAD_DIST = 'test1/test2/test3/1.jpg'
UPLOAD_DIST = 'test1/test2/test3/1.jpg'
実行
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で参照することが出来ます。
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

フォルダ階層指定
以下のようなパスを指定して再度実行します。
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/

