うまくいくかもしれないので忘れないように参考のリンクをアップしておくことにしました。ー>結論としてはうまくいきました。8月5日のことです。
最近は皆phpだから、html5使ったサンプル下手に使おうとすると大変な目に合うという戒め!
こちらにまとめました。
=========================================
webと言う技術ができるう~んと前からperlは存在する。
そして、wwwが登場した時にperlはとんでもないパワーを発揮したのだ(今じゃ皆PHPだ)。
当時サーバーにユーザの入力を送るのは「form」と言う技術を使ったのだ。
periはサーバーでformがsubmitした時に待ち構えていて「キー」と「値」のパラメータを受け取った。
そして、fileのフォーマッタのデータ(バイナリ)を受け取る時にちょっとした「癖」があるようなのだ。
バイナリの大きなファイルを送る時は、まずはファイルハンドルとして一旦メモリのアドレスを送り、非同期通信をしているようなのである。
なので、perlでは、formから受け取ったパラメータの値を
これは全く知らなかった。というよりも、fileフォーマとの通信はやったことがなかったのである。
どうしてもread()関数のところでファイルハンドルが開けないというエラーが起こるのである。
[Mon Aug 3 14:30:02 2020] _main.cgi: read() on unopened filehandle at /Users/saito/Sites/hcpt.jp/cloud/koubun/_/sys_kobun/_p/_05zuroku/_00_zuroku_bunki.pm line 23.
ajaxでphpなんかに送る時は直接バイナリを送って、しまうようなのだ。
perlでのバイナリをファイルに書くインターフェースは一回read()でえ読んでから書かなければ駄目のようなのだ。
なので、こちらの方法で送ると確かにバイナリデータは送られるが、サーバーOSに落としてもファイルは画像として認識されないのだ。
長くかかったのである。
結論としては、「form」全体を丸ごとdataにして、送り、(ファイルハンドルとして)取り出して、その上で、「file」に関しては別途read()で読むという方法をとった。
まだネットの速度が遅い時代に非同期通信としてformからのデータを受け取ったのだろう。
このシステムでは、パスワードをperlにパラメータで送る必要があり、そこが難点だったのだがformを変数化してajaxに送る時に動かすことができて上手く回避できた。
石丸さんのWEBのサンプルを使うことで上手く出来た。
最初に見て作ったサンプルが、input type=file からバイナリを取り込んでサヌネイル作るものだった。
プログラムが裏で何やっているかわからないままにいてはならないという戒めである。
=========================================
perlでは昔ながらの「form+subumit」でpostリクエストでパラメータを受け取る。
html5を利用すると、実際のバイナリデータをサーバーに送りつける。
ajaxなので待ちがないからこういう事ができる。
=========================================
最終的には、こちらのサンプル(友人に作ってもらった)で解決しました。
さすがperlの先生である。
ajaxで送る時はformに皆変数を乗せて、そのform全体をデータ(「ハッシュのハッシュ」のような構造体になるのだろうか?)にして送ると出来るのだ。
今ネットにはやたら複雑なサンプルが多くてハマってしまったのです。
form全体を単位で扱うということに気が付かなかったのです(笑)。
これが僕の駄目なサンプル。残しておこうっと。
http://hde.hcpt.jp/cloud/ftest/
=========================================================-----
tech-blog.rakus.co.jp
何よりもformのファイル名を参照してそこから実データを取り込むところが分からなかった。
1ページに沢山同じフォームが繰り返してえ並ぶので大変なのだ。
developer.mozilla.org
IEで上手く動かないようなことが書かれていた。
FileReader.resultを調べた。
FileReaderに関して。どうも僕はよく分かっていないのである。
ja.javascript.info
総論として結構早めに読んどけばよかった(笑)。
so-zou.jp
サムネイル表示する
総論的にfile apiを解説している。
www.atmarkit.co.jp
サーバーーで書き込む時にバイナリーモードにすること。
perldoc.jp
www.tohoho-web.com
rfs.jp
今回のお勉強は、まずはformをどう扱うかが問題だった(まだ途中)。
けど、なんとかなりそうである。
読み込みの間に処理が追い越してしまうのでコールバックにしようかと思った。