MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensのRestAPIをPythonで実行する その3(ファイルのアップロード)

本日は HoloLens の調査枠です。
前回記事の続きです。
bluebirdofoz.hatenablog.com

今回はPOSTメッセージを使って HoloLens の特定のディレクトリにファイルをアップロードしてみます。

なお、HoloLens で利用可能な API は以下の公式ページにまとめられています。
・デバイス ポータル コア API リファレンス(すべての Windows 10 デバイスに共通する API)
docs.microsoft.com
・デバイス ポータル Mixed Reality API リファレンス(HoloLens で利用できるすべての REST API の拡張リスト)
docs.microsoft.com

pythonサンプルコード

HoloLens の特定のディレクトリにファイルをアップロードする python スクリプトを作成します。
ファイルアクセスの API は以下の /api/filesystem/apps/file です。
f:id:bluebirdofoz:20190130093817j:plain

ファイルをアップロードする場合、POSTメッセージを利用する必要があります。
また、ブラウザを介さないWifi接続の場合はSSLを無効にしないとPOSTが失敗するようです。
DevicePortalから Preferences -> SSLconnection -> required のチェックを外しておきます。
f:id:bluebirdofoz:20190130094144j:plain

ローカルフォルダにある upload.jpg を、HoloLens の Picuture フォルダにアップロードする python スクリプトを作成してみました。
・UpLoadJPG.py

import requests
import base64
import os

# 実行指定で呼び出されているかチェック
if __name__ == "__main__":

     print('--------------------------- START ---------------------------')
     # DevicePortal接続のための設定項目
     # username:ユーザ名
     # password:パスワード
     # Wifi接続ではSSLを無効にする必要がある(よってhttp接続)
     # DevicePortalのPreferences->SSLconnectionのrequiredのチェックを外す
     username = 'USERNAME'
     password = 'PASSWORD'
     ipaddress = '192.168.XX.XXX'

     # RestAPIアクセスのURLを作成
     api = '/api/filesystem/apps/file'
     url = 'http://' + ipaddress + api

     # パラメータを指定(Pictureフォルダ直下に保存)
     payload = {'knownfolderid': 'Pictures', 'packagefullname': '\\', 'path': '\\'}

     # アップロードファイルの指定
     uploadDir = 'C:\\Users\\PCNAME\\Desktop\\hololens\\20190119\\HoloLensAPITest\\HoloLensAPITest\\TestProgram\\Upload'
     fileName = 'upload.jpg'
     uploadFilePath = os.path.join(uploadDir, fileName)

     # RestAPIのURLと設定を指定してGET/POST実行
     header = {'Content-Type': 'multipart/form-data'}
     fileBinary = open(uploadFilePath, 'rb')
     file = {'file': (fileName, fileBinary, 'image/jpeg')}
     response = requests.post(url, params = payload, files = file, auth=(username, password))

     # RestAPIの応答メッセージを受信(正常の場合 code=200 が返却)
     print(response.text)
     print(response.status_code)

     print('--------------------------- END ---------------------------')

実行してみた結果が以下になります。
f:id:bluebirdofoz:20190130093958j:plain

指定したアップロード先フォルダを確認すると、画像ファイルがアップロードできています。
f:id:bluebirdofoz:20190130094014j:plain