以前に東芝 FlashAir 内の特定ファイルをウェブサーバーにアップロードする、という lua スクリプトを作って紹介したことがありました:
一応、このスクリプトは動くのですが、残念なことに固定ファイルしかアップロードできませんでした。理想を言えば「FlashAir に最後に作成されたファイル」を調べることができれば、LUA_SD_EVENT イベントをフックして、「新しいファイルが追加されたら、そのファイルをアップロードする」ということができるようになるのですが、このブログエントリを記述した頃はまだそこまで lua を分かっていませんでした。
で、今乗ってる電車の目的地までしばらく時間がある時間と気持ちに余裕ができたので、FlashAir の特定ディレクトリ内で最も最近作成されたファイルを調べるスクリプトを作ってみました(赤字はコメントです):
このスクリプトは FlashAir 内の \DCIM\100__TSB というフォルダの中を調べて最も作成日時(実際には更新日時)が新しいファイルを探して last_filepath という変数にそのファイルのファイルパスを代入する、という処理を実行しています。
というわけで、このスクリプトを使って上述リンク先の前回作成した lua スクリプトを改良して、「FlashAir の \DCIM\100__TSB フォルダ内に新しいファイルが作られたらウェブサーバーにアップロードする」という lua スクリプトを作ってみました:
これを FlashAir の \lua\upload.lua という名前で作成し、\SD_WLAN\config ファイルに以下の1行を追加すると、FlashAir の \DCIM\100__TSB フォルダに新しいファイルができる度にそのファイルはウェブサーバーにアップロードされる、という処理が実現できるようになります:
そしてウェブサーバー(XX.XX.XX.XX)側のドキュメントルートに up.php というアップロードの受け口となるモジュールが用意されていればこれでアップロードできます。こちらのサンプルは上述の前回リンクの中で紹介しているサンプルのようなものになります(サンプルは PHP です)。
Lua のファイルシステム API についてはこちらのリファレンスを参照してください:
http://keplerproject.github.io/luafilesystem/manual.html#reference
一応、このスクリプトは動くのですが、残念なことに固定ファイルしかアップロードできませんでした。理想を言えば「FlashAir に最後に作成されたファイル」を調べることができれば、LUA_SD_EVENT イベントをフックして、「新しいファイルが追加されたら、そのファイルをアップロードする」ということができるようになるのですが、このブログエントリを記述した頃はまだそこまで lua を分かっていませんでした。
で、
last_filepath = "" max_mod = 0 fpath = "/DCIM/100__TSB" 目的のフォルダ for filename in lfs.dir(fpath) do 目的フォルダ内の全ファイルを探す filepath = fpath .. "/" .. filename mod = lfs.attributes( filepath, "modification" ) ファイルの最終更新日時 if mod > max_mod then 更新日時が最新(最大)のファイルを探す max_mod = mod last_filepath = filepath end end :
(この時点で last_filepath に最新ファイルのパスが格納されている) :
このスクリプトは FlashAir 内の \DCIM\100__TSB というフォルダの中を調べて最も作成日時(実際には更新日時)が新しいファイルを探して last_filepath という変数にそのファイルのファイルパスを代入する、という処理を実行しています。
というわけで、このスクリプトを使って上述リンク先の前回作成した lua スクリプトを改良して、「FlashAir の \DCIM\100__TSB フォルダ内に新しいファイルが作られたらウェブサーバーにアップロードする」という lua スクリプトを作ってみました:
last_fname = "" last_fpath = "" max_mod = 0 fpath = "/DCIM/100__TSB" for filename in lfs.dir(fpath) do filepath = fpath .. "/" .. filename mod = lfs.attributes( filepath, "modification" ) if mod > max_mod then max_mod = mod last_fname = filename last_fpath = filepath end end boundary = "1234567890" contenttype = "multipart/form-data; boundary=" .. boundary mes = "--" .. boundary .. "\r\n" .."Content-Disposition: form-data; name=\"file\"; filename=\""..last_fname.."\"\r\n" .."Content-Type: image/png\r\n\r\n" .."\r\n" .."--" .. boundary .. "--\r\n" blen = lfs.attributes(last_fpath,"size") + string.len(mes) - 17 b, c, h = fa.request{url = "http://XX.XX.XX.XX/up.php", method = "POST", headers = {["Content-Length"] = tostring(blen), ["Content-Type"] = contenttype}, file = fpath, body = mes }
これを FlashAir の \lua\upload.lua という名前で作成し、\SD_WLAN\config ファイルに以下の1行を追加すると、FlashAir の \DCIM\100__TSB フォルダに新しいファイルができる度にそのファイルはウェブサーバーにアップロードされる、という処理が実現できるようになります:
LUA_SD_EVENT=/lua/upload.lua
そしてウェブサーバー(XX.XX.XX.XX)側のドキュメントルートに up.php というアップロードの受け口となるモジュールが用意されていればこれでアップロードできます。こちらのサンプルは上述の前回リンクの中で紹介しているサンプルのようなものになります(サンプルは PHP です)。
Lua のファイルシステム API についてはこちらのリファレンスを参照してください:
http://keplerproject.github.io/luafilesystem/manual.html#reference