東芝のFlashAirエミュレータ
プログラムメモ | 2016/02/19 Fri 00:33
| FlashAirエミュレータ flashair-lua-dev で少し困った。
FlashAirのエミュレータを探していて
https://flashair-developers.com/ja/documents/resources/
の下の方に表示される、flashair-lua-dev を試した。
fa オブジェクトがエミュレートできるので大変便利で助かったのですが、
ファイルを multipart/form-data でアップロードが出来なかった。
【手順】
https://flashair-developers.com/ja/documents/api/lua/reference/#request
のファイルアップロードのサンプルコードを使い、flashair.luaを呼び出すが、通信が完了しない。
(CentOS 6.7 x86)
【問題点】
「引数bodyに、<!--WLANSDFILE-->が記述された場合、置き換えで、file内容を埋め込む」
というFlashAir独自仕様が満たされていないように見えます。
【対策案】
少し冗長ですが、flashair.luaのtrequest関数を、次の様に修正する。
local trequest = function(...) local param = ... local url = param["url"] local method = param["method"] local headers = param["headers"] local file = param["file"] local reqbody = param["body"] local bufsize = param["bufsize"] local redirect = param["redirect"] -- Hundredsoft add start if (file ~= nil) then local fp = io.open(file, "rb") if (fp ~= nil) then local r1, r2 = string.match(reqbody, "(.-)%<%!%-%-WLANSDFILE%-%-%>(.+)") if (r1 ~= nil and r2 ~= nil) then reqbody = r1 .. fp:read("*a") .. r2 end fp:close() end end -- Hundredsoft add end local http = require("socket.http") local ltn12 = require("ltn12") local body = {} local b, c, h = http.request { url = url, sink = ltn12.sink.table(body), method = method, headers = headers, source = ltn12.source.string(reqbody), step = nil, proxy = nil, redirect = redirect, create = nil, } return table.concat(body), c, h end
で、動いた。
CentOS上では、メモリが豊富なので bodyに、<!--WLANSDFILE--> などと打ち込まず、
ファイル内容を、そのまま入れ込む方法でも動きますが、
実機(FlashAir)では、大きな写真を送ろうとすると、メモリ不足でコケてしまいます。
大きな画像を送るときには、<!--WLANSDFILE--> は、必須のようです。
個人的には、あとは、FTP エミュレータができると、とても嬉しい。
Tags: プログラムメモ
author : HUNDREDSOFT | - | -